用于处理三个文件的Awk
输入: 预期产出:用于处理三个文件的Awk,awk,Awk,输入: 预期产出: File 1 col1 col2 col3 col4 col5 col6 col7 A 91 - E Abu 7 - B 82 - f Anu 9 - C 93 - G Aru 8 - File 2 col1 col2 col3 col4 col5 col6 col7 A 91 - x Bob 7 - B
File 1
col1 col2 col3 col4 col5 col6 col7
A 91 - E Abu 7 -
B 82 - f Anu 9 -
C 93 - G Aru 8 -
File 2
col1 col2 col3 col4 col5 col6 col7
A 91 - x Bob 7 -
B 82 - y Bag 9 -
C 93 - z Bui 8 -
File 3
col1 col2 col3 col4 col5 col6 col7
A 91 - T Can 7 -
B 82 - U Con 9 -
C 93 - V Cuu 8 -
我有三个文件在col1和col2有相同的数据。我需要打印所有文件的第五列以及前两列。
我可以用两个文件来做。有人能帮我处理三个或更多的文件吗 以下是使用awk的一种方法:
如果需要排序的输出,可以通过管道对输出进行排序。这不限于三个文件。它可以扩展到n个文件。只需将文件名添加到末尾,或使用*将全局文件添加到给定目录下的所有文件中 假设由于这句话,所有三个文件都有相同的行数 我有三个文件在col1和col2有相同的数据
这将丢弃每个文件的第一行,然后逐行读取文件,打印所需字段。何时打印col1和col2?如果在所有三个文件中它们相等或存在其他条件?Join map page-@TomRon:Join命令只能在一列上进行连接。虽然你当然可以让它工作,但它不是微不足道的。当然,我想这部分取决于连接是在一列还是两列上。我立即在col1和col2上看到了一个两列联接,如果col6也必须匹配,它可能是一个三列联接,但是如果只有col1被联接,那么只要文件按顺序排序,联接就足够容易使用。当然,问题是“col1和col2”。如果文件1包含一个78-H Aux 7-的额外行,那么输出应该是什么?Aux到底应该出现在输出中,还是应该省略?这同样适用于文件2和文件3中不匹配的行吗?如果文件1中有一行a 78-H Aux 7-会发生什么情况?即使在文件2或文件3中没有匹配项,带有A/78键的行仍将被打印。@JonathanLeffler不清楚OP是否只想排除所有文件中不存在的打印数据。
col1 col2 col3 col4 col5
A 91 Abu Bob Can
B 82 Anu Bag Cun
C 93 Aru Bui Cuu
$ awk '
BEGIN {
SUBSEP = FS;
print "col1 col2 col3 col4 col5"
}
FNR>1 {
a[$1,$2] = (a[$1,$2]?a[$1,$2]FS$5:$5)
}
END {
for(x in a) print x, a[x]
}' file1 file2 file3
col1 col2 col3 col4 col5
C 93 Aru Bui Cuu
A 91 Abu Bob Can
B 82 Anu Bag Con
awk 'BEGIN{OFS="\t";
getline<"file1";getline<"file2";getline<"file3";
print "col1","col2","col3","col4","col5";
while(1) {getline < "file1";a=$1;b=$2;c=$5;getline<"file2";d=$5;f=getline<"file3";e=$5;
if(!f)exit;print a,b,c,d,e}}'
col1 col2 col3 col4 col5
A 91 Abu Bob Can
B 82 Anu Bag Con
C 93 Aru Bui Cuu