首页 > 解决方案 > 在 Unix 中粘贴具有不等行和多列的文件

问题描述

假设我有三个文件,内容如下:

文件1:

AAA     BBB     CCC
123     563     2467

文件2:

NA      NA      NA

文件3:

DDD     EEE     FFF
2333    236     908
123     376     887

我想粘贴这些文件并为空字段插入 0,如下所示:

AAA     BBB     CCC     NA      NA      NA      DDD     EEE     FFF
123     563     2467    0       0       0       2333    236     908
0       0       0       0       0       0       123     376     887

我什至无法通过粘贴的第一步。当我尝试paste file1 file2 file3它变成这样:

AAA BBB CCC NA  NA  NA  DDD EEE FFF
123 563 2467        2333    236 908
        123 376 887

虽然我发现它pr -m -t file1 file2 file3有效,但它不显示完整的字符串,因为我有一些长字符串。

在这种情况下如何让它工作?提前致谢。

标签: unixawkpaste

解决方案


你可以使用 GNU awk (从这个答案修改。注意订购部分):

$ gawk '
BEGIN {
    FS=OFS="\t"                                                   # set delimiters
}
{
    for(i=1;i<=NF;i++)                                            # iterate data fields
        a[FNR][s+i]=$i                                            # hash them
}
ENDFILE {
    s+=NF                                                         # store field count
}
END {
    for(i in a) {                                                 # in awk order
        for(j=1;j<=s;j++)                                         # and data
            printf "%s%s",(a[i][j]==""?0:a[i][j]),(j==s?ORS:OFS)  # output
    }
}' file1 file2 file3

输出:

AAA     BBB     CCC     NA      NA      NA      DDD     EEE     FFF
123     563     2467    0       0       0       2333    236     908
0       0       0       0       0       0       123     376     887

推荐阅读