使用AWK

时间:2019-01-15 15:32:48

标签: linux unix awk split

文件看起来像这样,但是有几百万行({TAB被分隔):

1_number_column_ranking_+   100 200 Target "Hello" 

我想用_划分第一列,这样它就变成了:

1 number column ranking + 100 200 Target "Hello"

这是我一直在尝试的代码:

awk -F"\t" '{n=split($1,a,"_");for (i=1;i<=n;i++) print $1"\t"a[i]}' 

但这不是我所需要的。
感谢您的帮助(有关本主题的其他主题对我没有帮助)。

2 个答案:

答案 0 :(得分:2)

无需拆分,只需替换即可:

awk 'BEGIN{FS=OFS="\t"}{gsub("_","\t",$1)}1'

例如:

$ cat file
1_number_column_ranking_+       100     200     Target "Hello"

$ awk 'BEGIN{FS=OFS="\t"}{gsub("_","\t",$1)}1' file
1       number  column  ranking +       100     200     Target "Hello"

gsub将替换所有出现的情况,当未给出第三个参数时,它将替换为$ 0。
最后一个1{print}的快捷方式。 (总是true,暗含{print}。)

答案 1 :(得分:2)

另一个awk,如果“ _”仅出现在第一列中。 用正则表达式“ [_ \ t] +”分割输入字段,然后在主节中执行类似$ 1 = $ 1的虚拟操​​作,以便使用OFS =“ \ t”

重建$ 0。
$ cat steveman.txt
1_number_column_ranking_+       100     200i    Target  "Hello"

$ awk -F"[_\t]" ' BEGIN { OFS="\t"} { $1=$1; print } ' steveman.txt
1       number  column  ranking +       100     200i    Target  "Hello"

$

感谢@Ed,它从-F"[_\t]+"更新为-F"[_\t]",可以避免串联空字段。