約1500行以上のタブで区切られたテキストファイルがあります。
入力.txt
id sno1
EN1 Nucus_2158_mri_1/2_Co_1.0_Le_3104
EN2 Nucus_2158_mri_4/2_Co_1.0_Le_3104
EN3 Nucus_2158_mri_1/2_Co_1.0_Le_3104
EN4 Nucus_2158_mri_1/2_Co_1.0_Le_3106
EN5 Nucus_2158_mri_1/2_Co_1.0_Le_3104
EN6 Nucus_2159_mri_1/2_Co_1.0_Le_3104
Nucus_{2158}_mri_{1/2}_Co_1.0_Le_{3104}
角かっこ()内の値をキャプチャし、一致するIDのリストを印刷して、列(sno1)から正確に一致するものを取得したいと思います。 awk/sedのお手伝いをいただきありがとうございます。
出力.txt
Nucus_2158_mri_1/2_Co_1.0_Le_3104 EN1,EN3,EN5
答え1
2番目の要素全体がすべての場合で同じであると仮定すると、それを連想配列のキーとして使用できます。ここawk
に依存する例があります:
awk '
/^EN/ {
if(H[$2] == "")
H[$2] = $1
else
H[$2] = H[$2]","$1
}
END {
for(key in H)
print key, H[key]
}' infile
出力:
Nucus_2158_mri_4/2_Co_1.0_Le_3104 EN2
Nucus_2159_mri_1/2_Co_1.0_Le_3104 EN6
Nucus_2158_mri_1/2_Co_1.0_Le_3104 EN1,EN3,EN5
Nucus_2158_mri_1/2_Co_1.0_Le_3106 EN4
答え2
awkコマンドライン変数を使用して、3つのキー(以下の例では最初、2番目、3番目の名前)を渡します。
awk -v first=2158 -v second=1/2 -v third=3104
'$2 == "Nucus_"first"_mri_"second"_Co_1.0_Le_"third{print($2,$1)}' input.txt
| awk '{deleter=$1; gsub(deleter, "", $0);} NR != 1 {deleter=""}{print(deleter" "$0)}'
| sed -e 's/^\s\+//g' | sed ':a;N;$!ba;s/\n/,/g'