ファイル1.csv
9,hello-world.com.,A,192.168.0.9
1,hello1-world.com.,A,192.168.0.1
2,hello2-world.com.,A,192.168.0.2
3,hello3-world.com.,A,192.168.0.3
4,hello4-world.com.,A,192.168.0.4
5,hello5-world.com.,A,192.168.0.5
6,hello6-world.com.,A,192.168.0.6
7,hello7-world.com.,A,192.168.0.7
8,hello8-world.com.,A,192.168.0.8
ファイル2.csv
hello4-world.com.,A,192.168.0.4
hello2-world.com.,A,192.168.0.2
hello7-world.com.,A,192.168.0.7
2つのcsvファイルがあり、file1には多くのデータがあり、file2にはデータが少なくなります。 file1でfile2の列1を見つける必要があります。一致するテキストにのみ追加する必要がある file1 から file2 までの最初の列の値が必要です。
出力には、新しい値で更新された別々のファイルまたはfile2が必要です。
予想出力:
4,hello4-world.com.,A,192.168.0.4
2,hello2-world.com.,A,192.168.0.2
7,hello7-world.com.,A,192.168.0.7
Pythonコードを試してみました。
#! /usr/bin/python
t = {}
address = {}
for lines in open("file2.csv"):
columns = lines.strip().split(",")
name = columns[0]
t[name] = columns[1]
address[name] = columns[2]
for lines in open("file1.csv"):
columns = lines.strip().split(",")
name = columns[1]
try:
print("{},{},{},{}".format(columns[0], name, t[name], address[name]))
except KeyError:
print("{},{},{},{}".format(columns[0], name, columns[2], columns[3]))
上記のコードを試しましたが、file1のすべての内容を出力にコピーしましたが、file2の一致内容のみが必要です。
よろしくお願いします。
ベストアンサー1
データが本当に単純な場合(フィールド内にカンマがなく、フィールド内に改行がなく、示した非常に単純な例外には何もありません)、Pythonスクリプトは実際には必要ありません。簡単な awk 1 行の操作を実行できます。
$ awk -F, 'NR==FNR{a[$1]; next} $2 in a' file2.csv file1.csv
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7
これは、単に最初のファイルを読み込み(NR==FNR
「フル入力行番号が現在のファイルの行番号と同じ」という意味で「最初のファイルを読み取るとき」を意味します)、最初のフィールドをa
(a[$1]
)の配列に保存してから2番目のファイルは、a
配列内の2番目のフィールドを見つけることができるすべての行を印刷します。
次のようにすることもできます。
$ grep -Ff <(cut -d, -f1 file2.csv) file1.csv
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7
ただし、これは file1 のどのフィールドに関係なく、file2 の最初のフィールド値と一致します。
重要な警告:csvファイルは非常に複雑な可能性があるため、データを完全に制御でき、最初の文の条件が常に満たされていることを保証できる場合(内部カンマなし、複数行フィールドなし)にのみ、この機能を使用してください。