如何在插入不同的分隔符时合并文本文件的最后四列?

如何在插入不同的分隔符时合并文本文件的最后四列?

我有一个文件:

sample_1   sample_2   sample_3   category   subcategory   class   levels
52         59         80         wild       animal        herbe   small
25         65         71         pet        insect

我想合并第三列之后的所有列以获得我想要的输出:

sample_1   sample_2   sample_3   info         
52         59         80         wild|animal|herbe|small
25         65         71         pet|insect

答案1

考虑以下 awk 脚本:

awk 'BEGIN { IFS=OFS="\t" }
     NR==1 { print "sample_1" OFS "sample_2" OFS "sample_3" OFS "info" }
     NR >1 { four=$4
             for(i=5; i <= NF; i++) four=four"|"$i
             print $1 OFS $2 OFS $3 OFS four }' input

该脚本分为三个部分:

  1. BEGIN-- 在脚本读取任何输入之前,它将输入和输出字段分隔符设置为制表符。
  2. NR==1-- 这会重写标题,如您所示。
  3. NR >1-- 这会折叠四个字段以与选项卡 (OFS) 组合。它通过使用字段 #4 初始化新值来实现此目的;然后它循环遍历剩余的字段并用管道字符附加它们的值。循环完成后,它会打印重新组装的行。

答案2

如果您的行中没有尾随空格,则使用 GNU sed 可以快速完成:

$ sed -E -e 's/\s+/\|/4g' -e '1s/\S*$/info/' file
sample_1   sample_2   sample_3   info
52         59         80         wild|animal|herbe|small
25         65         71         pet|insect

如果行有尾随空格,您可以先将其删除:

sed -E -e 's/ +$//' -e 's/\s+/\|/4g' -e '1s/\S*$/info/' file

答案3

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

awk 'NR >1{$4=$4$5$6$7;$5=$6=$6=$7="";print $0}' filename| sed '1i sample_1   sample_2   sample_3   info '| awk '{printf "%s%10s%10s%30s\n",$1,$2,$3,$4}'

输出

sample_1  sample_2  sample_3            info
52        59        80          wildanimalherbesmall
25        65        71                     petinsect

相关内容