3

やや長い awk スクリプトがあり、ファイルの「右側」に 2 つの列を追加したいと考えています。次のファイルが進行中です。

Node    temporary_Temperature   steady_Temperature  temporary_Sight steady_Sight    
1                   x                   x                   -                   -                   
2                   x                   x                   -                   -                   
3                   -                   -                   -                   -                   
4                   -                   -                   -                   -                   
5                   x                   x                   x                   -                   
6                   -                   -                   -                   -                   
7                   -                   -                   -                   -                   
8                   -                   -                   -                   -                   
9                   -                   -                   -                   -                   
10                  -                   -                   -                   -                   
11                  -                   -                   -                   -                   
12                  -                   -                   -                   -                   
13                  x                   x                   -                   -                   
14                  x                   x                   -                   -                   
15                  x                   -                   -                   -                   
16                  -                   -                   -                   -                   

データは既にファイルに書き込まれており、awk を使用してこのファイルの行を反復処理し、さらに 2 つの列を追加します。ヘッダー行に列fooとを追加しbar、その後、他のものに応じて各行にxまたはを追加します。-どうすればこれを達成できますか?私は長いスクリプトの途中なので、awkスクリプト内からsedを呼び出して同じファイルに出力する方法がない限り、sedを使用したくありませんか?

4

2 に答える 2

4

ここで直面する問題は、awk がフィールドを変更するたびに$0、IFS を OFS に置き換えて を書き換えることです。FS が「任意の量の空白」(デフォルトの FS) であり、「スペース」(デフォルトの OFS) に置き換えられると、フォーマットが失われます。

デモンストレーションするには:

[ghoti@pc ~]$ printf 'one    two\tthree\n'
one    two      three
[ghoti@pc ~]$ printf 'one    two\tthree\n' | awk '{$4 = "four"} 1'
one two three four

各行のフィールドを実際に変更する必要はなく、文字列を追加するだけの場合は、フィールド セパレータを書き換えずにそれを行うことができます。

[ghoti@pc ~]$ printf 'one    two\tthree\n' | awk '{print $0 "\tfour"}'
one    two      three   four

あなたのスクリプトや追加したいデータの種類を見ないと、あなたの状況に適用できるとわかっている具体的な例を提供するのは難しいですが、ここにあなたが始めるための例があります:

  NR == 1 {
    print $0 "\tfoo\tbar";
    next;
  }
  {
    print $0 "\t" (conditionone ? "x" : "-") "\t" (conditiontwo ? "x" : "-");
  }

条件の作成にサポートが必要な場合は、質問に含めてください。上記のコードでは短い形式を使用しました。明らかにスペースを空けて を使用して複数行の印刷を作成しprintf()たり、 に含まれる 2 つの条件に基づいて変数を設定したりできますprint

別の方法として、入力データを処理するときに書式設定をやり直すこともできます。例(質問の末尾のスペースが実際に入力ファイルのように見えると仮定します):

BEGIN {
  fmt="%-20s%-20s%-20s%-20s%-20s%-20s%s\n";
}

NR == 1 {
  printf("%s%12s%-20s%-20s\n", $0, " ", "foo", "bar");
  next;
}

{ foo="-"; bar="-"; }

conditionone { foo="x"; }
conditiontwo { bar="x"; }

{
  printf(fmt, $1, $2, $3, $4, $5, foo, bar);
}

おそらく、1行目の間隔をいじる必要があります。

于 2013-02-07T15:36:28.627 に答える
1

問題がフォーマットである場合は、出力をパイプしますcolumn -t

例:

awk '
    NR==1 {print $0, "foo", "bar"; next} 
    {print $0, ($2=="x"?"-":"x"), ($4=="x"?"-":"x")}
' file | column -t

出力

Node  temporary_Temperature  steady_Temperature  temporary_Sight  steady_Sight  foo  bar
1     x                      x                   -                -             -    x
2     x                      x                   -                -             -    x
3     -                      -                   -                -             x    x
4     -                      -                   -                -             x    x
5     x                      x                   x                -             -    -
6     -                      -                   -                -             x    x
7     -                      -                   -                -             x    x
8     -                      -                   -                -             x    x
9     -                      -                   -                -             x    x
10    -                      -                   -                -             x    x
11    -                      -                   -                -             x    x
12    -                      -                   -                -             x    x
13    x                      x                   -                -             -    x
14    x                      x                   -                -             -    x
15    x                      -                   -                -             -    x
16    -                      -                   -                -             x    x
于 2013-02-07T23:39:21.233 に答える