いろいろな方法を試してきましたが、まだ望む結果が得られません。申し訳ありませんが、まだ学習中です。
私が欲しいのはこんな感じです:
ファイル 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
を使用してレコードが再形成されるため、コンマは「消え」ます。 を使用すると、コンマ文字 (またはコマンド ラインで で使用する任意の文字)に設定されるため、これを防ぐことができます。OFS
BEGIN { OFS=FS }
OFS
-F