awk 打印列

awk 打印列

因此,我尝试将数据解析为不同的格式,但最后一列数据包含分隔符。

如果我使用:

awk -F: {' print $1 "\t" $2 "\t" $3 '}

数据是:

ExampleCol1:ExampleCol2:Ex:am:ple:Col3

我只得到:

ExampleCol1    ExampleCol2    Ex

我怎样才能抓住之后的其余列$2?所以像这样:

print $1 "\t" $2 "\t" $(REST OF COLUMNS)

答案1

如果我正确理解你的问题,这对你有用吗?

sed -e 's/:/\t/1' -e 's/:/\t/1' yourFile

它用制表符替换前两个冒号并打印其余部分

根据您的示例数据,输出是

ExampleCol1    ExampleCol2    Ex:am:ple:Col3

我不确定,因为在你的问题中你说你得到了

ExampleCol1:ExampleCol2:Ex

执行您提供的 awk 命令时,我得到

ExampleCol1    ExampleCol2    Ex

答案2

_example='ExampleCol1:ExampleCol2:Ex:am:ple:Col3'

awk -F: '{printf $1 "\t" $2 "\t"} {for(i=3;i<=NF;i++) printf $i "\t"} {print ""}' <<<"${_example}"

...看起来有点乱,但会输出...

ExampleCol1 ExampleCol2 Ex  am  ple Col3

...可能有一种更简洁的方式来表达你想要的东西,awk例如...

awk -F: '{for(i=1;i<=NF;i++) printf $i "\t"} {print ""}' <<<"$_example"

...但是上面的内容应该会让你更接近期望的行为awk

更新

哦,看起来你可能想要第二列后面的冒号,如果是这样的话......

awk -F: '{printf $1 "\t" $2 "\t"} {for(i=3;i<NF;i++) printf $i ":"} {print $NF}' <<<"$_example"

awk...用...来回答这个问题可能更正确一些

ExampleCol1 ExampleCol2 Ex:am:ple:Col3

答案3

一种出路可能如下所示:

 $ awk -vOFS="\t" '{
     sub(/:/, OFS)
     sub(/:/, OFS)
 }1' inp

或者,作为另一种方式:

 $ awk '! /:.*:/ || sub(/:/, "\t") && sub(/:/, "\t")' inp

答案4

尝试使用以下命令,效果很好

命令

 sed "s/:/ /3g" filename| awk -F ":" '{print $1,$2,$3}'| sed "s/ /:/3g"| awk 'OFS="\t" {print $1,$2,$3}'

输出

ExampleCol1 ExampleCol2 Ex:am:ple:Col3

相关内容