AWK заменяет вкладки в последнем столбце условиями

Я пытаюсь работать с набором данных, который содержит вкладки в качестве разделителей, но в последнем столбце есть настраиваемое поле, в котором пользователи могут вводить пользовательский текст, включая вкладки. Сейчас я пытаюсь удалить эти вкладки, используя

awk "/\t/{c++;if(c==7){sub(\"\t\",\"\");c=0}}1" users10000.csv >users10000awk.csv

но кажется, что между 6-м и 7-м столбцом нет разделителя, а 7-й пуст.

То, что я сейчас пытаюсь сделать, это только заменить вкладки, найденные после 7-го, если последнее поле не пусто через

awk /\t/{c++;if((c==7) && ($12!=\"\")){sub(\"\t\",\"\");c=0;}}1 usersorig.csv >usersorigawk.csv 

но это приводит к ошибке

){sub(\"\t\" was unexpected at this time.

Я совершенно новичок в AWK и надеялся, что он легко сработает, но к форматированию - это боль, к которой нужно привыкнуть. Есть ли шанс, что вы могли бы помочь?

Пример ввода:

100008949   esttrellitta    264 44  6853    0   28 Dec 2009 18:01:42 GMT    El Paso,Tx.
100009841   ChelseaBex  152 50  394 0   28 Dec 2009 18:05:43 GMT    
100012792   ErinPattisonn   984 666 5003    0   28 Dec 2009 18:19:39 GMT    under your bed.
100013967   TUBeautifulRosa 323 251 1269    0   28 Dec 2009 18:24:51 GMT    on  Twitter ....... ahaahaa !
100014135   GeenaJohnson    144 130 9789    0   28 Dec 2009 18:25:37 GMT    Arkansas
100015928   GooSau  93  286 8075    0   28 Dec 2009 18:33:59 GMT    
10001882    rjwilson    1   340 6358    0   6 Nov 2007 15:54:47 GMT iPhone: 39.053871, 95.674576
100019750   HovMinajJackson 135 136 6022    0   28 Dec 2009 18:51:29 GMT    neverland
100020433   MattieBX    131 97  2610    0   28 Dec 2009 18:54:40 GMT    zundert
100024321   KatieStepek 64  93  503 0   28 Dec 2009 19:13:08 GMT    Hamilton
137179909   LaLovesU    431 499 19568   0   26 Apr 2010 01:45:05 GMT    Oakland,\   CA

Последняя строка является одним из преступников, которых я хочу отредактировать.

2 ответа

Возможно это то что ты хочешь?

$ seq 10 | paste -sd'\t'

1       2       3       4       5       6       7       8       9       10

$ seq 10 | paste -sd'\t' | sed 's/\t/ /7g'

1       2       3       4       5       6       7 8 9 10

Я думаю, что только gnu-sed это поддерживает. Также обратите внимание, что d'\t' уже по умолчанию, но только для того, чтобы подчеркнуть, что мы используем вкладки

ОБНОВИТЬ

Чтобы это работало на файле с разделителями табуляции построчно

$ sed 's/\t/ /7g' input.file > output.file

awk решение. Я предположил, что вкладка является разделителем полей, что верно в приведенном вами примере. Если разделитель может быть табуляцией или пробелом, вам придется использовать awk split функция.

awk -F'\t' '{
    for (i=1; i < NF; i++) {     # iterator and print
        if (i < 7) {
            printf("%s ", $i)    # for <7 column, print space as separator
        } else {
            printf("%s\t", $i)   # for 7+ column, print as it is with tab
        }
    }
    print ""                     # print new line - record separator
}'

Однолинейное решение:

awk -F'\t' '{for (i=1; i < NF; i++) { if (i < 7) { printf("%s ", $i) } else { printf("%s\t", $i)} }print ""}'
Другие вопросы по тегам