2013-02-07 30 views
3

我有一個很長的awk腳本,我想在文件的「右側」追加兩列。我有進步的以下文件:使用awk將列附加到文件中

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在這個文件中的行,並讓我們說,追加兩列。在標題行處,我想附加列foobar,然後根據其他內容將x-附加到每行。我怎樣才能做到這一點?由於我處於較長的腳本中,我不想使用sed,除非有某種方法可以從awk腳本中調用sed並將其打印到同一個文件中?

回答

4

您可能在這裏面臨的問題是,每當awk修改字段時,它會重新編寫您的$0,用OFS替換IFS。如果你的FS是「任意數量的空格」(默認的FS),並且它被替換爲「空格」(默認的OFS),那麼你將失去格式。

爲了證明:

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

如果你真的不想要修改場的每一行的,你只是想apend一個字符串,你可以做到這一點無需重寫你的字段分隔符:

[[email protected] ~]$ 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()進行多行打印,或者根據這兩個條件設置變量以包含在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號線。

+0

謝謝您的詳細解釋;我的awk技能有所提高!我的問題實際上比我在工作日結束時描述的要複雜得多。我迭代fileA並打印到fileB(fileB顯示在OP中)。然後我想迭代fileC並從那裏打印一些結果列到文件B.我實際上最終打印了兩個文件,並使用'paste fileA fileC> fileB',然後刪除文件A和文件C.不是很漂亮,但它工作。我會很感激這個方法的任何評論,並且接受你的回答,因爲它回答了我原來的(描述不佳)問題。 –

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