将命令放入 awk 中以合并不同文件的列

将命令放入 awk 中以合并不同文件的列

例如,我有一个 file.txt (每行的列数不同):

1 2 3 4
5 5 6 
7 7 7 7 9 10

我有另一个文件 (file2.txt),其中包含 2 列

    a b
    c d
    e f

我使用这个命令:

awk '{print $1,$(cut -f2 file2.txt)}' file.txt > final.txt

我想获取 file2.txt 的第二列并将其添加到 file1.txt 的第 1 列和第 2 列之间。

前任。结果:

1 d 2 3 4 
5 d 5 6
7 f 7 7 7 9 10

我还想维护 file1.txt 的所有剩余列

答案1

纯的awk

awk '
    FNR==NR{c[NR]=$2}
    FNR!=NR{$1 = $1 OFS c[FNR]; print}
' file2 file

输出:

1 b 2 3 4 
5 d 5 6 
7 f 7 7 7 9 10

答案2

稍微剪切和粘贴怎么样?

paste -d" " <(cut -d" " -f1 file1.txt) <(cut -d" " -f2 file2.txt) <(cut -d" " -f2- file1.txt)

答案3

虽然 awk 的某些实现确实允许从管道子进程1中读取,但在这种情况下,我建议从第二个文件中读取整行,并在 awk 内进行字段分割:

$ awk '(getline line < "file2.txt") > 0 {split(line,a); $1 = $1 FS a[2]} 1' file1.txt
1 b 2 3 4
5 d 5 6
7 f 7 7 7 9 10

或者,您可以考虑使用pasteand cut,完全避免 awk


  1. 参见例如从管道使用 getline

答案4

尝试使用以下命令

awk 'FNR==NR{b[FNR]=$2;next}{print $1,b[FNR],$2,$3,$4,$5,$6,$7}' file2.txt  file1.txt 

相关内容