文件看起来像这样,但是有几百万行({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]}'
但这不是我所需要的。
感谢您的帮助(有关本主题的其他主题对我没有帮助)。
答案 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]"
,可以避免串联空字段。