通过粘贴命令格式化输出文件

通过粘贴命令格式化输出文件

我有两个或更多文件

文件A

A: 18.49 RPKM    
C: 14.49 RPKM    
B: 18.89 RPKM

文件B

A: 21.29 RPKM    
C: 38.71 RPKM    
B: 36.13 RPKM

我想粘贴这两个文件并仅打印每个文件中的第一列一次和第二列

所需输出(制表符分隔)

A:  18.49   21.29   
C:  14.49   38.71   
B:  18.89   36.13

我使用了粘贴命令

paste FileA FileB | awk '{ { print $1} {ORS="\t"} for (i=2; i<=NF; i+=3) { print $i } {print "\n"} }'

我得到这个输出

A:

18.49 21.29

中:14.49 38.71

乙:18.89 36.13

您能建议如何解决这个问题吗?谢谢 !!

答案1

对于每个 UNIX 机器上任何 shell 中的任何 awk,对于任意数量的输入文件,您所需要的只是:

$ paste FileA FileB | awk '{o=$1; for (i=2; i<NF; i+=3) o=o"\t"$i; print o}'
A:      18.49   21.29
C:      14.49   38.71
B:      18.89   36.13

答案2

ORS是输出记录分隔符(通常是换行符)。这就是为什么第一个{print $1}后面会出现换行符。通常,您需要设置OFS输出字段分隔符,用于分隔字段。

您可以将所需字段移动到开头,而不是有选择地打印每个字段(以便第 5 列(第二个文件的第二列)变为第 3 列,第 8 列(第三个文件的第二列)变为第 4 列,依此类推。然后您可以减少NF删除剩余的、不必要的列。

BEGIN { OFS = "\t" }
{
  nfiles = NF / 3;  # get number of files
  for (i = 2; i <= nfiles; i++)  # second column is already OK, start from 3
    $(i+1) = $(3*i - 1);   # Assign 2nd column of file no. i to column no. i + 1
  NF = nfiles + 1 # set NF to delete remaining columns
}
1  # print lines

例如,有FileCBFileD和 A 的副本:

~ paste File* | awk -v OFS='\t' '{nfiles = NF / 3; for (i = 2; i <= nfiles; i++) $(i+1) = $(3*i - 1); NF = nfiles + 1} 1'
A:  18.49   21.29   21.29   18.49
C:  14.49   38.71   38.71   14.49
B:  18.89   36.13   36.13   18.89

答案3

join fileA fileB |awk '{ print $1"\t"$2"\t"$3 }'. 

请确保两个文件都按同一列排序。

相关内容