design-patterns - 使用 sed 或 awk 查找并追加文件中具有相同 ID 的行

标签 design-patterns sed awk

我有一些采用以下格式的文件 { 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/

相关文章:

design-patterns - 哪种 GoF 模式是您离不开的?

ios - 我怎样才能改进这个涉及 NSDate 比较的实现?

string - 需要帮助使用 Bash 和 sed 着色/替换任意字符串

linux - 如何删除字符串输出的前两个单词

linux - 如何使用 awk 获取所有 A 列与 B 列对的分数的最大值和平均值?

java - 将装饰器设计模式用于类的层次结构

java - 按需初始化 holder 习语的正确实现

sed - 如何在下一个 sed 命令中使用管道的结果?

linux - 如何在包含模式 [ :alpha:], 的任何行之前添加字符串 "<fc=ff00>"但不添加两个连续行?

linux - 只打印第一个和最后一个匹配的模式