2つのCSVファイルがあります
ID1,V1,V2,V3,V4
1,4,5,3,3
2,66,77,46,44
3,66,77,46,44
ID2,V1,V2,V3,V4
55,4,5,3,3
84,66,77,46,44
CSVをどのように取得しますか?
ID1,ID2
1,55
2,84
3,84
V1,V2,V3,V4
2つのCSVファイルのブロックを一致させますか?
の対応する値をfile1
置き換えて再現することが目標です。つまり、ファイルの行数は 。V1,V2,V3,V4
ID2
file2
result
file1
ID1
そしてID2
ユニークで秩序でID1,ID2
ユニークです。ファイル形式が正しいです。,
5列に区切り文字で区切られた数字のみを表示します。
ファイルはかなり大きく(1B行)これが私が必要なものですawk
。
与えられた解決策ここそれはうまくいきますが、逆の接続(Universal ID)なので、私の場合に合わせて調整することはできません。
ベストアンサー1
以下は高速で、そのsort
部分だけがメモリに大量のデータを格納し、ページングなどを実行するように構築されています。処理すれば大丈夫でしょう。
$ cat tst.sh
#!/usr/bin/env bash
# First awk output is hdrFlag,fileNr,ID,VALs1-4 then we sort on
# the hdrFlag to handle the header line first, then the key values
# so we can process all matching keys together from both input
# files so we only have to store the IDs for the current key set.
awk 'BEGIN{FS=OFS=","} FNR==1{++fileNr} {print (FNR>1), fileNr, $0}' "$@" |
sort -t, -k1,1n -k4 |
awk '
BEGIN { FS=OFS="," }
{
curr = $4 FS $5 FS $6 FS $7
if ( curr != prev ) {
prt()
prev = curr
}
ids[$2] = ($2 in ids ? ids[$2] " " : "") $3
}
END { prt() }
function prt( file,numFiles) {
for (file in ids) {
numFiles++
}
if (numFiles > 1) {
print ids[1], ids[2]
}
delete ids
}
'
。
$ ./tst.sh file1 file2
ID1,ID2
1,55
2,84
同じ4つの値のセットに対して、ファイル間に複数の一致する項目がある状況をどのように処理するかを推測しています。