2

私はこのようなファイルを持っています

1      2      "45554323"      p      b  
2      2      "34534567"      f      a  
3      3      "76546787"      u      b  
2      4      "56765435"      f      a  
*      a  
0      b  

セクションの最後の 2 つのレコードから を削除aしたいbEND{}

結果:

1      2      "45554323"      p      b  
2      2      "34534567"      f      a  
3      3      "76546787"      u      b  
2      4      "56765435"      f      a  
*        
0        

最後のn行を取得してawkでフィールドを変更するにはどうすればよいですか?

4

4 に答える 4

4

awk を使用する 1 つの方法を次に示します。

awk -v count=$(wc -l <file.txt) 'NR > count - 2 { $2 = "" }1' file.txt

結果:

1      2      "45554323"      p      b  
2      2      "34534567"      f      a  
3      3      "76546787"      u      b  
2      4      "56765435"      f      a  
* 
0 

またはawk、入力ファイルの最後の 2 行を除くすべてのレコードをシェル スクリプトとして操作するには、 を試してください./script.sh file.txt。の内容script.sh:

command=$(awk -v count=$(wc -l <"$1") 'NR <= count - 2 { $2 = "" }1' "$1"
echo -e "$command"

結果:

1  "45554323" p b
2  "34534567" f a
3  "76546787" u b
2  "56765435" f a
*      a  
0      b  
于 2012-10-14T14:53:23.187 に答える
3

-の値がわかっている場合は、行/列(ここ)の最後の項目を削除したい行番号が機能ますn4

awk '{if (NR>4) NF=NF-1}1' data.txt

あげる:

1      2      "45554323"      p      b  
2      2      "34534567"      f      a  
3      3      "76546787"      u      b  
2      4      "56765435"      f      a  
*
0

NF = NF -1awkは、行のフィールドが1つ少ないと見なします。これは、条件が満たされると、行の最後の列/アイテムを表示しない方法です。NR読み取られるファイルの現在の行番号を参照します。

awkは、ファイルを1回通過するか、その情報(たとえばwc -l)が与えられない限り、ファイルの行数を知ることはできません。別のアプローチは、最後の行をバッファに保存しn(スライディングウィンドウ/テープ遅延タイプのアナロジーのようなもので、常にn後ろに行を印刷します) 、ブロックの最後のn行を処理することです。END

于 2012-10-14T13:45:02.210 に答える
2

これはあなたの質問に正確に答えるものではありませんが、必要な出力を生成します。

$ gawk '{if (NF < 3) print $1; else print}' input.txt
1      2      "45554323"      p      b
2      2      "34534567"      f      a
3      3      "76546787"      u      b
2      4      "56765435"      f      a
*
0
于 2012-10-14T13:42:11.577 に答える
2
$ cat file
1      2      "45554323"      p      b
2      2      "34534567"      f      a
3      3      "76546787"      u      b
2      4      "56765435"      f      a
*      a
0      b

$ awk 'BEGIN{ARGV[ARGC++]=ARGV[ARGC-1]} NR==FNR{nr++; next} FNR>(nr-2) {NF--} 1' file
1      2      "45554323"      p      b
2      2      "34534567"      f      a
3      3      "76546787"      u      b
2      4      "56765435"      f      a
*
0

または、ファイル名を手動で 2 回指定してもかまわない場合は、次のようにします。

awk 'NR==FNR{nr++; next} FNR>(nr-2) {NF--} 1' file file
于 2012-10-14T14:28:35.027 に答える