Awk 如何仅解析具有不同分隔符的一列?
我有一个制表符分隔的文件。最后一列是分号,用不相等的长线分隔。我想分析这个专栏 输入:Awk 如何仅解析具有不同分隔符的一列?,awk,Awk,我有一个制表符分隔的文件。最后一列是分号,用不相等的长线分隔。我想分析这个专栏 输入: AA 762 8640 BB CC DD EE=T;FF=C;GG=G;HHA II 852 6547 JJ KK LL MM=G;NN=P;QQ=RF 期望输出: AA 762 8640 BB CC DD EE=T FF=C GG=G HHA II 852 65
AA 762 8640 BB CC DD EE=T;FF=C;GG=G;HHA
II 852 6547 JJ KK LL MM=G;NN=P;QQ=RF
期望输出:
AA 762 8640 BB CC DD EE=T FF=C GG=G HHA
II 852 6547 JJ KK LL MM=G NN=P QQ=RF
例如,我可以使用此代码获得前三个值:
awk 'BEGIN { FS=";" } { print $1, $2, $3}' file
但是,当我运行它时,它不会解析列,而是按原样打印文件:
awk 'BEGIN { FS=";" } { print $0}' file
如何解决此问题?您可以尝试以下方法:
awk 'BEGIN{FS=OFS="\t"}{gsub(/;/,"\t",$NF)}1' file
另一种方法
使用
tr
将分号替换为如下选项卡:
tr ";" "\t" <yourfile
tr”;“\t”我们可以放下打印
只做awk…'{$1=$1}1'input.txt
但比晦涩更清晰<代码>:)
@jaypal,显式的打印可能是我的Python根背叛了我:-)是的,我喜欢它readable@1_CR非常感谢。你能解释一下[:space:][/code>指定的内容吗?另外,OFS和vOFS之间有什么区别?@user2162153,-F'[[:space:];]'
将字段分隔符设置为空白或代码>(空白是制表符或空格字符)-vOFS='\t'
实际上是-vOFS='\t'
。这允许通过命令行传入OFS
,而不是在script@1_CR谢谢awk
如何理解单词space
表示空格分隔符?+1。还有,tr”;“\t”1yourfile@1\u CR这很流畅,我还以为你喜欢它的可读性<代码>:P
@杰帕尔,如果你理解其中的含义,它实际上是相当优雅的
$ awk 'BEGIN{FS=OFS="\t"}{gsub(/;/,"\t",$NF)}1' file
AA 762 8640 BB CC DD EE=T FF=C GG=G HHA
II 852 6547 JJ KK LL MM=G NN=P QQ=RF
awk -F'[[:space:];]' -vOFS='\t' '{$1=$1;print}' input.txt
AA 762 8640 BB CC DD EE=T FF=C GG=G HHA
II 852 6547 JJ KK LL MM=G NN=P QQ=RF
tr ";" "\t" <yourfile