![通过粘贴命令格式化输出文件](https://linux22.com/image/156162/%E9%80%9A%E8%BF%87%E7%B2%98%E8%B4%B4%E5%91%BD%E4%BB%A4%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6.png)
我有两个或更多文件
文件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
例如,有FileC
BFileD
和 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 }'.
请确保两个文件都按同一列排序。