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