Bash 如何合并共享同一关键字的两行?

Bash 如何合并共享同一关键字的两行?,bash,scripting,Bash,Scripting,假设我有一个类似以下内容的文件: X NeedThis1 KEYWORD . . NeedThis2 X KEYWORD NeedThis2 NeedThis1 KEYWORD 我需要将这两条线合并为一条,如下所示: X NeedThis1 KEYWORD . . NeedThis2 X KEYWORD NeedThis2 NeedThis1 KEYWORD 需要对该文件中包含相同关键字的每一行执行此操作,但不能将两行这样的内容组合在一起(第一|第二位置有两个X) 我认为自己是bash

假设我有一个类似以下内容的文件:

X NeedThis1 KEYWORD
.
.
NeedThis2 X KEYWORD
NeedThis2 NeedThis1 KEYWORD
我需要将这两条线合并为一条,如下所示:

X NeedThis1 KEYWORD
.
.
NeedThis2 X KEYWORD
NeedThis2 NeedThis1 KEYWORD
需要对该文件中包含相同关键字的每一行执行此操作,但不能将两行这样的内容组合在一起(第一|第二位置有两个X)


我认为自己是bash noob,因此,如果可以使用awk或sed之类的工具来实现,我将不胜感激。

我不会给出完整答案,但如果您有办法识别“关键字”(不在问题陈述中),请使用bash关联数组:

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

你当然需要做更多的修改,但是你的问题陈述不完整,有些工作需要读者练习。

试试这个:

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

  • 当第一个字段为X的行时,将最后一个字段存储为键,将第二个字段存储为值
  • 查找下一行,其中第二个字段是X,最后一个字段与上一个操作中存储的密钥匹配
  • 找到后,打印最后匹配行的值以及当前行的第一个字段和键
  • 如果您的数据与所显示的示例不匹配(如果数据之间有更多的空格或字段),那么这肯定会中断,因此请根据您的需要进行调整
可以使用
awk
sed
完成,但您需要发布一些相关数据以吸引好的解决方案。例如,
X
在您的文件中是否真的表示为
X
NeedThis1
的格式是什么?在我的文件中,X实际上是X,需要这个文件名,比如print.o。基本上这两个都是文件,其中一个通过关键字调用另一个。关键字是第一个文件中调用第二个文件的函数。谢谢,但我不知道关键字。。。我只想查看文件,当我看到两个相同的关键字时,将行合并为一行。好的,scriptlett将合并所有具有相同最终标记的行的文本。如果“final token”的意思是“keyword”,那么您只需转储所有找到的关键字和相关文本。-首先是关联文本,然后是关键字,以获得您要求的结果。根据您更新的问题注释,您使用:keys[$keyword]=valid填充关键字,并选择文本,其中${keys[$keyword]}为“valid”,行以关键字开头或前面有关键字“X”。除了帮你解决这个问题之外,我认为这应该会让你走。谢谢你,我也感谢你的努力,如果可能的话,我会投票给两个答案都是正确的。