AWK用条件替换最后一列中的选项卡

时间:2016-11-08 11:42:31

标签: 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 个答案:

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