このようなファイルがあります。
d1000 1000
d1001 100
d1002 10
d1003 1
長さが4ではない2番目の列を修正したいと思います。ただし、変更された行だけを印刷したいので、2列目の元のテキストは2列目に残り、変更は数字が増えて3列目に印刷されます。
希望の出力:
d1001 100 1101
d1002 10 1102
d1003 1 1103
次の行に従いますが、構文や結果を取得できません。
awk -v n=1100 '((length($2)!=4 && length($2)>0) {new=($2=++n)}; {print $1, $2, new}' file
答え1
print
既存の行()のパラメータとそのような$0
新しいフィールド,
の間に出力区切り文字を使用できます。
awk -v n=1100 'length($2)!=4 {print $0,++n}' file
出力:
d1001 100 1101
d1002 10 1102
d1003 1 1103
他の出力フォーマットが必要な場合に使用できます。printf
機能。以下はソートの例です。
$ awk -v n=1100 'length($2)!=4 {printf "%s %4s %s\n", $1, $2, ++n}' file
d1001 100 1101
d1002 10 1102
d1003 1 1103
$ awk -v n=1100 'length($2)!=4 {printf "%s %-4s %s\n", $1, $2, ++n}' file
d1001 100 1101
d1002 10 1102
d1003 1 1103
答え2
awk -v k=1100 '{if(length($2) !=4 && length($2)>0){k=k+1;print $1,$2,k }}' file.txt
出力
d1001 100 1101
d1002 10 1102
d1003 1 1103
答え3
使用幸せ(以前のPerl_6)
raku -ne 'state $i; if .words[1].match( /^ \d**0..3 $/ ) { print .words~" "; put ++$i + 1100 };'
この質問は最近の質問と似ています。その質問に対するRakuの回答を少し変更できます。
簡単に言えば、(前の質問と比較して)if .words[1]
2番目の列に\d**0..3
0〜3桁の数字のみを含む文字列と一致できるかどうかを尋ねる場合は、allを印刷してから、増加するベースから始めて.words
カウンタを返す3番目の列があります。 。値。$i
1100
++
入力例:
d1000 1000
d1001 100
d1002 10
d1003 1
出力例:
d1001 100 1101
d1002 10 1102
d1003 1 1103
https://unix.stackexchange.com/a/703436/227738
https://raku.org