因此,我尝试将数据解析为不同的格式,但最后一列数据包含分隔符。
如果我使用:
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