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