"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ブロックはで終わりますnext。つまり、最初のフィールドが配列のキーである場合、最初のファイルのみが実行されている間は1ブロックしか実行されません。 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,,,

このコマンドは、最初の2行を変更せずにパスしたいと仮定していますawk(これはテストの責任です)。このブロックは数値がキーであるかどうかをテストし、その場合はその行をコメントアウトしますが、そうでない場合は行の先頭にあるエントリが削除されます。File B.txtFNR > 2FNR > 2data//sub()

FNR > 2/^\/\/ /代わりに、テストファイルの上部にあるコメントを使用できます。これを行うには、すべてのコメントが常に//空白で始まる必要があります。

特殊変数には、これまでに読んだ行のNR総数FNR()と現在のファイル()があります。NRFNR


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

おすすめ記事