将一个文件中的列添加到另一个文件的列之后,同时考虑到这两个文件具有不同的列数



文件1

001 00A 892 J27
002 00G 742 M65
003 00B 934 B32
004 00J 876 K57
005 00k 543 N21

文件2有1628433列,但希望将文件1中的所有四列添加到此文件中的第一列之后。

a 2 T ..........
b 3 C ..........
c 4 G ..........
d 5 A ..........
e 6 B ..........

所需输出

a 001 00A 892 J27 2 T ..........
b 002 00G 742 M65 3 C ..........
c 003 00B 934 B32 4 G ..........
d 004 00J 876 K57 5 A ..........
e 005 00k 543 N21 6 B ..........

尝试了以下

awk 'NR==FNR{a[FNR]=$1,$2,$3,$4} {print $1,a[FNR],$5}' file2 file1

此版本的内存更轻:它每次只从每个文件中读取一行:

awk '{getline f1 < "file1"; $1 = $1 OFS f1; print}' file2

使用您显示的示例,请尝试以下awk代码。

awk 'FNR==NR{arr[FNR]=$1;next} {$1=$1 OFS arr[FNR]} 1' file2 file1

解释:简单的解释是,在读取文件2时使用FNR==NR条件。创建一个以行号为索引的数组,其中有第一个字段作为其值。在读取file1时,将当前行的等效数组的值保存到第一个字段中,然后在那里打印当前行。

$ paste -d' ' <(cut -d' ' -f1 file2) file1 <(cut -d' ' -f2- file2)
a 001 00A 892 J27 2 T ..........
b 002 00G 742 M65 3 C ..........
c 003 00B 934 B32 4 G ..........
d 004 00J 876 K57 5 A ..........
e 005 00k 543 N21 6 B ..........

这里有一个python,它一次处理一行输入文件:

python3 -c '
import sys
with open(sys.argv[1]) as f1, open(sys.argv[2]) as f2:
for l1, l2 in zip(f1,f2):
lf1,lf2=map(str.split, [l1,l2])
print(" ".join([lf2[0]]+lf1+lf2[1:]))
' file1 file2 
awk -F't' -v OFS="t" '{getline f1 < "file1"; $1 = $1 OFS f1; print}' file2

相关内容