1

awk コマンド内で条件文とループ文の両方を使用して、特別な値を持つファイルを「エラー」などの別の値に変換し、減算を行わずに、「エラー」などの変換された新しい値を出力として表示するにはどうすればよいですか?

  1. 列の値 (最終出力で同じままである列 1 を除く) のいずれも「11111」のような特別な値と等しくない場合、次のような awk コマンドを使用します。

    awk -F, '{print $1,$2,($3-$2),($4-$2),($5-$2),($6-$2),($7-$2),($8-$2),($9-$2),($10-$2),($11-$2),($12-$2),($13-$2),($14-$1)} ' all.cvs
    
  2. 列の値 = 特別な値の場合、「-$2」を実行する必要はなく、「エラー」のような新しい値を表示するだけです

基本的に私が欲しい:xは列#2から#14の列値を意味します

  • $2 (列 #2) = 11111 の場合

    set $2="Error"
    
  • $3 から $14 (列 #3 から #14) の場合、列の値が <> 11111 の場合

    $x=$x-$2 
    
  • 列の値 = 11111 の場合

    $x=Error
    
  • 最後に、出力には、元の #1 列の値と、列 #2 から #14 の変換/計算された新しい値を含む 14 列が表示されます。

次のようなファイル (all.cvs) があります。

  • 14分野

  • 各行には、「11111」(または任意の文字列値) のような値を持つフィールドが含まれる場合があります。

  • 「,」で区切られた各列

  • 総行数は90行


$cat all.cvs

A,11111,2,3,4,5,6,7,8,9,10,11,12,13 

B,1,2,3,4,5,6,11111,8,9,10,11,12,13 

C,1,2,3,4,5,6,7,8,9,11111,11,12,13 
....
4

3 に答える 3

3
awk -F, -v OFS=, -v flag_value=11111 '
  {subtract = $2}
  $2 == flag_value {$2 = "Error"; subtract = 0}
  {
    for (i=3; i<=NF; i++) $i = ($i == flag_value ? "Error" : $i - subtract)
    print
  }
'
于 2012-04-16T15:31:28.317 に答える
1

次のアプローチを使用できます。

$ awk -F, '
{ 
  printf("%s", $1); 
  s=($2 != 11111 ? $2 : 0); 
  printf(", %s", ($2 != 11111 ? $2 : "Error")); 
  for (i=3; i<=NF; ++i) 
    printf (", %d", ($i != 11111 ? ($i - s) : "Error")); 
  printf("\n"); 
}' all.csv
于 2012-04-16T08:23:53.827 に答える
0

条件付きブロックをデフォルト ブロックの前に置きます。next次の行から処理を再開するには、それぞれの末尾に置きます。

于 2012-04-16T07:05:02.383 に答える