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 ""}'