合并两个单独文件中的列


10

如何使用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

Answers:


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

谢谢!我还使用gawk成功尝试了这种方法:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah 2014年

2
@Dovah:您可以使用paste file1 file2,然后在中打印选定的字段awk
cuonglm

这存储file2在内存中,如果文件很大,可能会禁止使用。有一种更简单的方法来执行此操作,而无需占用内存(请参阅我的答案)。
吉尔(Gilles)'所以

17

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

paste file1.txt file2.txt | cut -f 1,2,3,6

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

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

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

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

到目前为止,我假设您想将文件1的第1行与文件2的第1行匹配,文件1的第2行与文件2的第2行匹配,依此类推。如果要匹配列的内容,则为完全不同的事情。join只要您要匹配的列已排序,它将完成该工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.