用于处理三个文件的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