아래와 같이 탭으로 구분된 파일이 있고 모든 열의 일치 항목을 기준으로 행을 병합하고 싶습니다. 열 수는 일반적으로 2개이지만 경우에 따라 3개까지 달라질 수 있습니다.
입력하다:
AMAZON NILE
ALASKA NILE
HELLO MY
MANGROVE AMAZON
MY NAME
IS NAME
원하는 출력:
AMAZON NILE ALASKA MANGROVE
HELLO MY NAME IS
이 문제는 어떻게 해결될 수 있나요 awk
?
다음 파일에도 적용되나요? 입력하다:
apple_bin2file strawberry_24files
mango2files strawberry_39files
apple_bin8file strawberry_39files
dastool_bin6files strawberry_40files
apple_bin6file strawberry_40files
orange_bin004file dastool_bin004files
orange_bin005file dastool_bin005files
apple_bin3file dastool_bin3files
apple_bin5file dastool_bin5files
apple_bin6file dastool_bin6files
apple_bin7file dastool_bin7files
apple_bin8file mango2files
탭으로 구분된 형식의 예상 출력:
apple_bin2file strawberry_24files
mango2files strawberry_39files apple_bin8file
dastool_bin6files strawberry_40files apple_bin6file
orange_bin004file dastool_bin004files
orange_bin005file dastool_bin005files
apple_bin3file dastool_bin3files
apple_bin5file dastool_bin5files
apple_bin7file dastool_bin7files
답변 주신 분들께 죄송합니다. 입력 파일을 업데이트했습니다!
답변1
GNU awk 사용
gawk '
{
grp = 0
# see if any of these words already have a group
for (i=1; i<=NF; i++) {
if (group[$i]) {
grp = group[$i]
break
}
}
# no words have been seen before: new group
if (!grp) {
grp = ++n
}
# if we have not seen this word, add it to the output
for (i=1; i<=NF; i++) {
if (!group[$i]) {
line[grp] = line[grp] $i OFS
}
group[$i] = grp
}
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (n in line) {
print line[n]
}
}
' input.file
첫 번째 입력:
AMAZON NILE ALASKA MANGROVE
HELLO MY NAME IS
두 번째 입력을 사용합니다(출력을 로 연결 column -t
).
apple_bin2file strawberry_24files
mango2files strawberry_39files apple_bin8file
dastool_bin6files strawberry_40files apple_bin6file
orange_bin004file dastool_bin004files
orange_bin005file dastool_bin005files
apple_bin3file dastool_bin3files
apple_bin5file dastool_bin5files
apple_bin7file dastool_bin7files
답변2
당신이 준 예를 들어, 시도해보십시오
awk '
{for (j=1; j<=MX; j++) {for (i=1; i<=NF && !(m=match (LN[j], $i)); i++);
if (m) {$i = ""
break
}
}
LN[j] = LN[j] $0 " "
if (j>MX) MX = j
}
END {for (l in LN) print LN[l]
}
' file3
AMAZON NILE ALASKA MANGROVE
HELLO MY NAME IS
편집: 새로운 데이터를 사용하면 다음과 같이 작동합니다.
awk '
{for (j=1; j<=MX; j++) {m = 0
for (i=1; i<=NF; i++) {if (match (LN[j], $i)) {$i = ""
m = 1
}
}
if (m) break
}
LN[j] = LN[j] $0 OFS
if (j>MX) MX = j
}
END {for (l in LN) {gsub (/ +/, OFS, LN[l])
gsub (OFS"+", OFS, LN[l])
print LN[l]
}
}
' OFS="\t" file