以下のようにタブ区切りのファイルがあり、すべての列の一致に基づいて行をマージしたいと思います。列数は通常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
2番目の入力を使用します(出力をに接続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