我有两个像这样的文件 File1
Cat01_02.1 LAFP2
Cat01_02.1 NUSP8
Cat01_02.1 SP028
Cat01_02.1 ASP01
Cat02_03.1 LAFP5
Cat02_03.1 NUSP6
Cat02_03.1 SP027
Cat02_03.1 ASP08
文件2
Dog06_04.7 LAFP2
Dog06_04.7 NUSP8
Dog06_04.7 SP028
Dog06_04.7 ASP01
Dog07_06.7 LAFP5
Dog07_06.7 NUSP6
Dog07_06.7 SP027
Dog07_06.7 ASP08
我需要从这个文件中创建一个表格,如下所示
Cat01_02.1 Dog06_04.7 LAFP2 NUSP8 SP028 ASP01
Cat02_03.1 Dog07_06.7 LAFP5 NUSP6 SP027 ASP08
我尝试使用 Transpose 函数,但在处理多行文件时它不起作用
答案1
目前尚不清楚整个问题是什么,但看起来您正在根据第二列中的键匹配第一列中的文件,然后将它们再次聚合到第二列中的键组上。如果这是正确的理解,那么这可能会起作用......
join -j 2 file2 file1 | sort -k 2 | awk '
BEGIN{getline; k=$1; f=$2" "$3}
{ while (f==$2" "$3){k=k" "$1; next} print f, k; f=$2" "$3; k=$1}
END{print f, k}'
首先join
在第二个字段上,然后将其他字段输出为第二个和第三个字段
然后sort
第二个(默认情况下是第三个)字段上的组合文件将猫/狗匹配分组在一起。
最后,awk
通过排序文件聚合猫/狗匹配,直到获得猫/狗组合的变化,在猫/狗组合的每次变化以及最后输出匹配键的聚合字符串。
答案2
cat File1 File2 | awk '{if (a[$2])a[$2]=a[$2]" "$1; else a[$2]=$1;}END{for (i in a) print i "-" a[i];}' | awk -F "-" '{if (a[$2])a[$2]=a[$2]" "$1; else a[$2]=$1;}END{for (i in a) print i " " a[i];}'
使用第一个 awk 命令,我按第二列进行分组。对于第二个,我按照狗和猫的模式进行分组。
但是结果的排序方式与您的示例不同。希望还是好的。
答案3
一种方法(假设输出顺序并不重要):
join -1 2 -2 2 -o 1.1 2.1 1.2 file1 file2 | awk '{a[$1 FS $2] = a[$1 FS $2] FS $3;}END{for(i in a ){print i, a[i];}}'
使用join
,file1
和file2
使用第二列连接。使用 awk,我们使用第一列作为键来累积结果。