4

入力.txt

1,Ram,Fail
2,John,Fail
3,Ron,Success

param.txt (新規入力)

1,Sam,Success
2,John,Sucess

ここで、input.txt の行全体を param.txt にある行に置き換えたいと思います。1列目は主キーのように機能します。

出力.txt

1,Sam,Success
2,John,Sucess
3,Ron,Success

としてみました

awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' input.txt param.txt > Output.txt 

しかし、ファイルの内容をマージしています。

4

5 に答える 5

4

これは、 への 1 回の呼び出しで実行できますsort

sort -t, -k1,1n -us param.txt input.txt

最初のコンマ区切りフィールドで安定した数値ソートを使用し、param.txt前にリストinput.txtして、重複を排除するときに正しい、新しい行が優先されるようにします。

于 2012-05-31T14:00:01.773 に答える
4

これはうまくいくかもしれません(GNU sed):

 sed 's|^\([^,]*,\).*|/^\1/c\\&|' param.txt | sed -f - input.txt

説明:

  • 最初のフィールドをアドレスとして使用してスクリプトに変換param.txtし、の行を変更します。sedinput.txts|^\([^,]*,\).*|/^\1/c\\&|
  • に対してスクリプトを実行しますinput.txtsed -f - input.txt
于 2012-05-31T06:22:12.323 に答える
2

これはで動作するはずですawk

awk -F"," 'NR==FNR{a[$1]=$0;next} ($1 in a){ print a[$1]; next}1' param.txt input.txt

テスト:

$ cat input.txt 
1,Ram,Fail
2,John,Fail
3,Ron,Success
$ cat param.txt 
1,Sam,Success
2,John,Sucess
$ awk -F"," 'NR==FNR{a[$1]=$0;next} ($1 in a){ print a[$1]; next}1' param.txt input.txt 
1,Sam,Success
2,John,Sucess
3,Ron,Success
于 2012-05-31T13:41:27.313 に答える
2

これを機能させるには、join(1) を使用できます。

$ join -t, -a1 -j1 Input.txt param.txt | sed -E 's/,.*?,.*?(,.*?,.*?)/\1/'
1,Sam,Success
2,John,Sucess
3,Ron,Success

sed as a pipe tail は、置き換えられた行から Input.txt のフィールドを取り除きます。

これは、両方の入力ファイルが最初のフィールドでソートされている場合にのみ機能します。

于 2012-05-31T06:34:51.107 に答える
2

純粋な awk は、この仕事に適したツールではありません。awk のみを使用する必要がある場合は、 https://stackoverflow.com/a/5467806/1301972が作業の出発点として適しています。

ただし、Unix には、実行しようとしている操作に適した入力を awk に供給するのに役立つツールがいくつか用意されています。

$ join -a1 -t, <(sort -n input.txt) <(sort -n param.txt) |
     awk -F, 'NF > 3 {print $1 "," $4 "," $5; next}; {print}'

基本的に、input.txt のキーで結合された行を含む 1 つのファイルを awk にフィードします。次に awk は、適切な表示または出力ファイルへのリダイレクトのために必要なフィールドを解析できます。

于 2012-05-31T06:42:15.463 に答える