如何组合共享相同关键字的两条线?

时间:2014-03-19 19:18:37

标签: bash scripting

假设我有一个看起来像这样的文件:

X NeedThis1 KEYWORD
.
.
NeedThis2 X KEYWORD

我需要将这两行合并为一行:

NeedThis2 NeedThis1 KEYWORD

需要对该文件中包含相同KEYWORD的每一行进行操作,但它不能组合两条看起来像这样的行(两个X位于第一个|第二个位置)

X NeedThis1 KEYWORD
X NeedThis2 KEYWORD

我正在考虑自己bash-noob所以如果可以用awk或sed之类的东西做任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

试试这个:

awk '
$1=="X" {key = $NF; value = $2; next}
$2=="X" && $NF==key {print value, $1, key}' file

<强>解释

  • 当第一个字段为X的行时,将最后一个字段存储为键,将第二个字段存储为值。
  • 查找下一行,其中第二个字段为X,最后一个字段与从先前操作存储的密钥匹配。
  • 找到后,打印最后一个匹配行的值以及当前行和键的第一个字段。
  • 如果您的数据与您显示的样本不匹配(如果它们之间有更多空格或字段),这肯定会中断,因此您可以根据需要自行调整。

答案 1 :(得分:1)

awk '
    {if ($1 == "X") end[$3] = $2; else start[$3] = $1} 
    END {for (kw in start) if (kw in end) print start[kw], end[kw], kw}
' file

答案 2 :(得分:0)

我不会给你完整的答案,但如果你有办法识别“KEYWORD”(不在你的问题陈述中),那么使用BASH关联数组:

declare -A keys
while IFS= read -u3 -r line
do
  set -- $line
  eval keyword=\$$#
  keys[$keyword]+=${line%$keyword}
done

你肯定要做些更多的小事,但你的问题陈述是不完整的,有些工作需要为读者练习。