'txt A'から番号を検索し、csvファイルに置き換えます

'txt A'から番号を検索し、csvファイルに置き換えます

いろいろな方法を試してきましたが、まだ望む結果が得られません。申し訳ありませんが、まだ学習中です。

私が欲しいのはこんな感じです:

ファイル A.txt

5844
6069
6303
6309

ファイル B.txt

// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,

A.txt から検索した番号を変更し、B.txt の行をコメント アウトします。検索した番号が別の列に表示されることがあるため、最初の列のみが変更されます。

結果:

// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,

試してみたのですが、時々おかしくなって他の列も変わってしまいました。そこで、このようなものを使用しましたが、とても長くて修正しにくいです。

awk -F ',' '/^5844/ && $1="5844"{$1="//5844"}1' b.txt > c.txt; cp c.txt ba.txt; rm -rf b.txt; mv ba.txt b.txt

また、区切り文字「,」が削除されることもあります。

助けてください、どうもありがとうございます。

答え1

$ awk -F , 'FNR==NR { data[$1]=1; next } $1 in data { $0 = "//" $0 }; 1' 'File A.txt' 'File B.txt'
500,5,4,8,,,
5535,5,4,6069,,,
2121,5,4,8,,,
//5844,5,4,5844,,,
//6069,5,4,8,,,

ここで行っているのは、まずFile A.txt連想配列 のキーとしてから数値を読み込むことですdata。次に、 の最初の各フィールドをテストして、File B.txtそれがキーであるdataかどうかを確認します。キーである場合は、//現在の行の先頭に追加します。変更されているかどうかに関係なく、すべての行が印刷されます。

テストFNR==NRは、コマンド ラインの最初のファイルから読み取っている間のみ true になり、ブロックは で終了しますnext。つまり、最初のフィールドが配列のキーである場合、最初のブロックは最初のファイルに対してのみ実行され、2 番目のブロックは 2 番目のファイルに対して実行されますdata

末尾のは1出力をトリガーし、 に置き換えることができます{ print }

上記は追加 //2番目のファイルの行を最初のファイルの番号と一致させます。取り除く //線からない一致しました(つまり、更新された質問を処理するため):

$ cat 'File B.txt'
// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,
$ awk -F , 'FNR==NR { data[$1]=1; next } FNR > 2 { if ($1 in data) $0 = "//" $0; else sub("^//","") }; 1' 'File A.txt' 'File B.txt'
// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,

このawkコマンドは、 の最初の 2 行を変更せずに渡すことを前提としていますFile B.txt(これはテストでFNR > 2処理されます)。FNR > 2ブロックは、数字がキー入力であるdataかどうかをテストし、キー入力である場合は行をコメント アウトしますが、キー入力でない場合は、 で//行の先頭のすべてが削除されますsub()

の代わりに、FNR > 2を使って/^\/\/ /ファイルの先頭のコメントをテストすることもできます。この場合、すべてのコメントが常に で始まり、//その後にスペースが続く必要があります。

特殊変数とNRには、FNRこれまでに読み取られた合計行数 ( NR) と現在のファイル内の行数 ( FNR) が保持されます。


最初のフィールドのみを で変更すると、現在の の値(デフォルトではスペース)$1 = "//" $1を使用してレコードが再形成されるため、コンマは「消え」ます。 を使用すると、コンマ文字 (またはコマンド ラインで で使用する任意の文字)に設定されるため、これを防ぐことができます。OFSBEGIN { OFS=FS }OFS-F

関連情報