在第二个文件的列之后添加一个文件的列,同时考虑两个文件具有不同的列数
adding columns from one file after a column in a second file while considering the two files have different number of columns
文件 1
001 00A 892 J27
002 00G 742 M65
003 00B 934 B32
004 00J 876 K57
005 00k 543 N21
文件 2 有 1,628,433 列,但想在此文件的第一列之后添加文件 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]=,,,} {print ,a[FNR],}' file2 file1
使用您展示的示例,请尝试以下 awk
代码。
awk 'FNR==NR{arr[FNR]=;next} {= OFS arr[FNR]} 1' file2 file1
解释: 简单的解释就是,在读取file2时使用FNR==NR
条件。创建具有行号索引的数组,并将第一个字段作为其中的值。在读取文件 1 时,将当前行的等效数组的值保存到第一个字段中,然后在那里打印当前行。
此版本内存更轻:
它一次只从每个文件中读取一行:
awk '{getline f1 < "file1"; = OFS f1; print}' file2
这是一次一行处理输入文件的 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
$ 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 ..........
awk -F'\t' -v OFS="\t" '{getline f1 < "file1"; = OFS f1; print}' file2
文件 1
001 00A 892 J27
002 00G 742 M65
003 00B 934 B32
004 00J 876 K57
005 00k 543 N21
文件 2 有 1,628,433 列,但想在此文件的第一列之后添加文件 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]=,,,} {print ,a[FNR],}' file2 file1
使用您展示的示例,请尝试以下 awk
代码。
awk 'FNR==NR{arr[FNR]=;next} {= OFS arr[FNR]} 1' file2 file1
解释: 简单的解释就是,在读取file2时使用FNR==NR
条件。创建具有行号索引的数组,并将第一个字段作为其中的值。在读取文件 1 时,将当前行的等效数组的值保存到第一个字段中,然后在那里打印当前行。
此版本内存更轻: 它一次只从每个文件中读取一行:
awk '{getline f1 < "file1"; = OFS f1; print}' file2
这是一次一行处理输入文件的 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
$ 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 ..........
awk -F'\t' -v OFS="\t" '{getline f1 < "file1"; = OFS f1; print}' file2