答案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
}