我正在尝试使用包含制表符作为分隔符的数据集,但最后一列有一个自定义字段,用户可以在其中输入自定义文本,包括制表符。现在我正在尝试使用
删除这些标签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
最后一行是我想编辑的罪魁祸首之一。
答案 0 :(得分:1)
也许这就是你想要的?
$ 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
答案 1 :(得分:0)
awk
解决方案。我假设选项卡是字段分隔符,在您给出的示例中为true。如果分隔符可以是制表符或空格,则必须使用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 ""}'