我有一个文件:
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
该脚本分为三个部分:
BEGIN
-- 在脚本读取任何输入之前,它将输入和输出字段分隔符设置为制表符。NR==1
-- 这会重写标题,如您所示。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