サンプル
wolf@linux:~$ cat data.csv
A,4.4.4.4,4.4.4.5,4.4.4.6,3.3.3.3,3.3.3.4
B,1.1.1.1,1.1.1.1,1.1.1.2,1.1.1.3,3.3.3.3
C,1.1.1.1,1.1.1.1,1.1.1.1,1.1.1.1,1.1.1.1
D,2.2.2.1,2.2.2.1,2.2.2.2,2.2.2.3,2.2.2.4
wolf@linux:~$
このサンプルにはいくつかの重複データがあります。たとえば、3.3.3.3
A行とB行に2つあります。
wolf@linux:~$ egrep 3.3.3.3 data.csv
A,4.4.4.4,4.4.4.5,4.4.4.6,3.3.3.3,3.3.3.4
B,1.1.1.1,1.1.1.1,1.1.1.2,1.1.1.3,3.3.3.3
wolf@linux:~$
これで、A,B,C,D
最初の列と関連データにのみ興味があります。
私が探すべき4つのデータは次のとおりです。
2.2.2.3
3.3.3.3
4.4.4.4
5.5.5.5
だから私はegrepで|
andを使います。-o
wolf@linux:~$ egrep '2.2.2.3|3.3.3.3|4.4.4.4|5.5.5.5' data.csv
A,4.4.4.4,4.4.4.5,4.4.4.6,3.3.3.3,3.3.3.4
B,1.1.1.1,1.1.1.1,1.1.1.2,1.1.1.3,3.3.3.3
D,2.2.2.1,2.2.2.1,2.2.2.2,2.2.2.3,2.2.2.4
wolf@linux:~$
出力は良好ですが、データが多すぎます。関連データと最初の列のみが必要です。
だからここに別の試みがあります-o
wolf@linux:~$ egrep -o '2.2.2.3|3.3.3.3|4.4.4.4|5.5.5.5' data.csv
4.4.4.4
3.3.3.3
3,3.3.3
2.2.2.3
wolf@linux:~$
これで問題は、最初の列(A/B/C/D
)を取得できないことです。
次回試してください
wolf@linux:~$ egrep '2.2.2.3|3.3.3.3|4.4.4.4|5.5.5.5' data.csv | cut -d , -f 1
A
B
D
wolf@linux:~$
最初の列は取得しましたが、データは取得できませんでした。出力を見るとA
両方とも何を表すのか3.3.3.3
、4.4.4.4
出力に表示されないのでわかりません。
これは実際に私が望む結果ではありません。今私が思うのはこれだ
希望の出力
入力する
2.2.2.3
3.3.3.3
4.4.4.4
5.5.5.5
出力
D 2.2.2.3
A,B 3.3.3.3
A 4.4.4.4
- 5.5.5.5
残念ながら、今は解決策を思い出していません。助けてください
ベストアンサー1
$ cat script.awk
NR == FNR {
a[$0]
next
}
{
for (i = 2; i <= NF; i++) {
for (k in a) {
if ($i == k) {
a[k] = a[k] ? a[k] "," $1 : $1
}
}
}
}
END {
for (k in a) {
print a[k] "\t" k
}
}
次のように実行します。
$ cat search.txt
2.2.2.3
3.3.3.3
4.4.4.4
5.5.5.5
$ awk -F, -f script.awk search.txt data.csv
A,B 3.3.3.3
D 2.2.2.3
A 4.4.4.4
5.5.5.5