我有一些采用以下格式的文件 { ID Type Size Nodes },例如:
1234 P 1 56
2212 P 2 45-46
1234 F
2567 P 3 90,99,101
2212 F
2567 F
其中每条 P 型线只有一个具有相同 ID 的匹配 F 型线,并且每对的 ID 不同。
我希望能够搜索文件和 P 类型的每一行,找到具有相同 ID 的匹配类型 F 行,然后附加 P 类型行中的“大小”和“节点”值。
这可能吗? 我可以想出一种方法在 bash 中使用关联数组来做到这一点,但我希望 sed/awk 可能有一些漂亮的小技巧来解决这样的问题,但我没有正确的单词来搜索它/看看它向上。我知道你可以保存模式,我的主要问题是找出搜索不同 ID 的最佳方法。
最佳答案
如果您不介意改变行顺序,最简单的方法是:
$ awk '$2=="P"{print;$2="F";print}' file
1234 P 1 56
1234 F 1 56
2212 P 2 45-46
2212 F 2 45-46
2567 P 3 90,99,101
2567 F 3 90,99,101
这是 F
行在出现 P
行之后更改的打印顺序(P
行的顺序是没有改变)。
如果您不希望更改顺序,但保证先出现 P
行,则:
$ awk '$2=="P"{a[$1]=$3FS$4}{print $1,$2,a[$1]}' file
1234 P 1 56
2212 P 2 45-46
1234 F 1 56
2567 P 3 90,99,101
2212 F 2 45-46
2567 F 3 90,99,101
否则,您有两种方法,缓冲或传递文件两次,这是传递两次解决方案:
$ awk '$2=="P"{a[$1]=$3FS$4}FNR!=NR{print $1,$2,a[$1]}' file file
1234 P 1 56
2212 P 2 45-46
1234 F 1 56
2567 P 3 90,99,101
2212 F 2 45-46
2567 F 3 90,99,101
这会很好,除非你的 actaul 文件非常大,在这种情况下,缓冲方法会更好:
$ awk '$2=="P"{a[$1]=$3FS$4}{b[NR]=$0;k[NR]=$1}END{for(i=1;i<=NR;i++)print b[i],a[k[i]]}' file
1234 P 1 56
2212 P 2 45-46
1234 F 1 56
2567 P 3 90,99,101
2212 F 2 45-46
2567 F 3 90,99,101
关于design-patterns - 使用 sed 或 awk 查找并追加文件中具有相同 ID 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16104234/