![将命令放入 awk 中以合并不同文件的列](https://linux22.com/image/156580/%E5%B0%86%E5%91%BD%E4%BB%A4%E6%94%BE%E5%85%A5%20awk%20%E4%B8%AD%E4%BB%A5%E5%90%88%E5%B9%B6%E4%B8%8D%E5%90%8C%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%97.png)
例如,我有一个 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
或者,您可以考虑使用paste
and cut
,完全避免 awk
- 参见例如从管道使用 getline
答案4
尝试使用以下命令
awk 'FNR==NR{b[FNR]=$2;next}{print $1,b[FNR],$2,$3,$4,$5,$6,$7}' file2.txt file1.txt