将文本文件重新排列为表格格式

将文本文件重新排列为表格格式

我有两个像这样的文件 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];}}'

使用joinfile1file2使用第二列连接。使用 awk,我们使用第一列作为键来累积结果。

相关内容