合并具有相同起始字段的行

合并具有相同起始字段的行

我想使用bash工具来解决以下两个相关问题。

1。假设我有一个包含以下几行的文件

A foo1
B bar
A foo2
A foo3 foo4
C ccc

如何合并具有相同起始字段的行?换句话说,我想得到以下输出:

A foo1 foo2 foo3 foo4
B bar
C ccc

2。完成第一个作业后,每行中可能会有重复的字段。例如,foo2 可能与 foo4 相同。如何删除重复项并仅保留其中之一(即仅保留 foo2)?必须对每一行执行此操作,但我们不关心跨行的重复。

背景:你可能会认为我正在编一本字典。每行的起始字段是一个单词,后面的字段是它的含义。

答案1

$ awk '
    { for (i=2; i<=NF; i++) if (!seen[$1,$i]++) map[$1] = map[$1] OFS $i }
    END { for (key in map) print key map[key] }
' file
A foo1 foo2 foo3 foo4
B bar
C ccc

上面假设您不关心输出行的顺序。

答案2

cat - <<\eof > file
A foo1
B bar
A foo2
A foo3 foo2
C ccc
eof

awk '
{
  word = $1
  for (i=2; i<=NF; i++) {
    meaning = $i
    sep = (!(word in dict) ? "" : OFS)
    dict[word] = dict[word] \
     (!seen[meaning]++ ? sep meaning : "")
  }
}
END {
  for (word in dict)
    print word, dict[word]
}
' file

A foo1 foo2 foo3
B bar
C ccc

相关内容