合并来自两个单独文件的列

dov*_*vah 10 awk text-processing columns

如何使用awk从两个单独的文件中创建一个合并选择性列的新文件?不会弄乱两个文件的元素顺序。

示例:文件 3 可能包含文件 1 中的第 1、2、3 列和文件 2 中的第 4 列。

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 20

有一个专门的工具:paste. 它将第一个文件中的每一行与第二个文件中的相应行连接起来;您可以在之前或之后删除不需要的列。例如,假设您的列是制表符分隔的:

paste file1.txt file2.txt | cut -f 1,2,3,6
Run Code Online (Sandbox Code Playgroud)

这是一种预过滤依赖于 ksh/bash/zsh 进程替换的文件的方法。

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')
Run Code Online (Sandbox Code Playgroud)

awk 主要用于一次处理一个文件,但您可以调用getline并行读取另一个文件。

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt
Run Code Online (Sandbox Code Playgroud)

到目前为止,我假设您想将文件 1 的第 1 行与文件 2 的第 1 行、文件 1 的第 2 行与文件 2 的第 2 行等匹配。如果您想匹配列的内容,那就是完全不同的事情。join只要您要匹配的列已排序,就可以完成这项工作。


cuo*_*glm 4

尝试这个:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5
Run Code Online (Sandbox Code Playgroud)

  • @Dovah:您可以使用“粘贴 file1 file2”,然后在“awk”中打印选定的字段。 (3认同)