文件处理以转置数据

文件处理以转置数据

我有一个包含适用于它们的 ID 和名称的文件,如下所示:

1234|abc|cde|fgh
5678|ijk|abc|lmn
9101|cde|fgh|klm
1213|klm|abc|cde

我应该将输出作为具有与每个名称匹配的 ID 的不同文件,如下所示

文件1:

abc
1234
5678
1213

文件2:

cde
1234
9101
1213

文件3:

Klm
9101
1213

文件4:

fgh
1234
9101

答案1

假设问题是,对于第 2、第 3、第 4、..n 个字段中存在的每个字符串写入一个以其开头的文件,并列出它出现的所有行的第一个字段中的字符串:

$ awk -F\| '{
   for(i=2; i <= NF; i++){
        if(!a[$i]){ a[$i] = "file_" ++f; print $i > a[$i] }
        print $1 > a[$i];
   }
}'
1234|abc|cde|fgh
5678|ijk|abc|lmn
9101|cde|fgh|klm
1213|klm|abc|cde
^D
$ for f in file_*; do echo === $f ===; cat $f; done
=== file_1 ===
abc
1234
5678
1213
=== file_2 ===
cde
1234
9101
1213
=== file_3 ===
fgh
1234
9101
=== file_4 ===
ijk
5678
=== file_5 ===
lmn
5678
=== file_6 ===
klm
9101
1213

答案2

awk -F '|' '
   {
    for(i = 2; i <= NF; i++)
        print $1 > $i;
    }
' yourFile.txt

该脚本将第一列写入其他列中存在的每个文件名中。

细节:

  • -F '|'将字段分隔符设置为管道字符
  • for(...)从第 2 列到最后一列
  • print $1 > $i将第 1 列的内容写入具有列名的文件中i

答案3

不确定您从哪里获得 id。
但假设你有它们,你可以尝试这样的事情:

for id in abc cde klm fgh; do
    awk -F'|' -v id=$id 'BEGIN{print id} $0 ~ id { print $1; }' test > $id
done

相关内容