동일한 시작 필드가 있는 행 병합

동일한 시작 필드가 있는 행 병합

나는 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

관련 정보