列 9-14 の文字が別のファイルに見つからない場合は、出力ファイルから行を除外します。

列 9-14 の文字が別のファイルに見つからない場合は、出力ファイルから行を除外します。

2つの列で区切られたファイルがあり、両方のファイルにトランザクション識別子が見つかったレコードのみを含む2つの新しいファイルを作成する必要があります。識別子は列9から14までのフィールドにありますが、各ファイルの各レコードには9から14の範囲の前後に固有のデータがあり、可変データを出力ファイルに転送する必要があります。各識別子は一度だけ現れるか、まったく現れないように保証されます。

私はPythonスクリプトを使って直接書くことができますが、ライブラリ内の列で区切られたファイルの基本的なサポートはあまりありません。以前のコンピューティング時代に合わせて作成されたため、この問題は簡単に処理できます。もちろん、ツールが古すぎる場合は、Pythonスクリプトを直接作成します(列で区切られたファイルを処理するパッケージを知っている場合を除く)。

ご協力ありがとうございます。


例:列9〜14の文字を含む行が各ファイルにあるため、ID:525この行はその出力ファイルに書き込まれます。両方の入力ファイルには、他のファイルに見つからないレコードがあります。

入力ファイル1.txt

Record1 ID:525 DATA A
Record2 ID:232 DATA B
Record3 ID:811 DATA C
Record4 ID:400 DATA D

入力ファイル2.txt

Record1 ID:448 DATA E
Record2 ID:525 DATA F

出力ファイル1.txt

Record1 ID:525 DATA A

出力ファイル2.txt

Record2 ID:525 DATA F

ベストアンサー1

GNU awk(別名)はUbuntu 20.04で使用でき、そのgawk変数を介して固定幅データを処理できます。FIELDWIDTHS

前任者。最も簡単に言えば

$ cat input_file1.txt
Record1 ID:525 DATA A
Record2 ID:232 DATA B
Record3 ID:811 DATA C
Record4 ID:400 DATA D

それから

$ gawk 'BEGIN{FIELDWIDTHS="8 6 *"} {print $2}' input_file1.txt
ID:525
ID:232
ID:811
ID:400

これに基づいて、次のことができます。

$ gawk '
  BEGIN {FIELDWIDTHS = "8 6 *"}
  BEGINFILE {outfile[ARGIND] = gensub("input","output","1",FILENAME)}
  NR==FNR {a[$2] = $0; next}
  ($2 in a){
    print a[$2] > outfile[1]
    print $0    > outfile[2]
  }
' input_file1.txt input_file2.txt

与える

$ head output_file?.txt
==> output_file1.txt <==
Record1 ID:525 DATA A

==> output_file2.txt <==
Record2 ID:525 DATA F

例を見るGNU Awkユーザーガイド:4.6固定幅データの読み取り

おすすめ記事