合并和追加 2 个以上文件的列

合并和追加 2 个以上文件的列

我有“N”个文件,其内容如图所示,我想合并并附加第五列

这些文件是制表符分隔的。

我有“N”个文件,其内容如上面的屏幕截图所示。我想合并它们并附加第五列。前 4 列相同。

我尝试awk对文件 1 和 2 使用以下命令:

awk 'NR==FNR{a[NR]=$0;next} {print a[FNR] "\t",$5}' file1 file2

它只附加 2 个文件,不超过 2 个。

如何使用 或其他工具正确执行此awk操作paste

答案1

如果前四列在文件中相同,您可以运行类似的命令

set -- file*
fields="-f-5,$(seq -s, 10 5 $((5*$#)))"
paste "$@" | cut ${fields%?} >outfile

这将paste提取所有文件的字段 1-5 以及之后的每 5 个字段。

答案2

未经测试:

awk -F "\t" '
    { key = $1 FS $2 FS $3 FS $4; values[key] = values[key] FS $5 }
    END { for (key in values) print key values[key] }
' file ...

标题

对于每个文件,您想要提取文件名的一部分并将其用作标题。我们将使用单独的字符串来跟踪标头,并将其附加到每个文件。

awk -F "\t" '
    BEGIN { header = "col1" FS "col2" FS "col3" FS "col4" }
    { 
        key = $1 FS $2 FS $3 FS $4
        values[key] = values[key] FS $5 
    }
    FNR == 1 { 
        split(FILENAME, a, /_/)
        header = header FS a[2] 
    }
    END { 
        print header
        for (key in values) 
            print key values[key] 
    }
' file ...

我们在 BEGIN 块中初始化标头。为前 4 列提供您需要的任何标题。

该变量FNR是当前文件的记录号。当FNR == 1我们位于该文件的第一行时。 awk 变量FILENAME保存当前正在处理的文件的名称。


排序

如果您使用 GNU awk 那么您可以在 END 块中执行此操作(参考):

    END { 
        print header
        # order the array by index, as strings, ascending
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (key in values) 
            print key values[key] 
    }

如果你没有 GNU awk,你可以这样做:

awk '...' | {
    read header
    echo "$header"
    sort
}

相关内容