2016-05-26 48 views
-1

我需要使用awk命令來處理我的一個數據文件。我怎樣才能用awk完成這個任務?任何投入將不勝感激。謝謝。根據編號爲其中一個字段分配行號。每行中的字段

1) Get the no. of fields for each row. 
    (a) If the count_of_fields = 'x' then assign a value to nth field in each row. 

輸入: -

1,x,A,B 
2,A,B,C 
3,x,C,D 
4,D,E,F,G 
5,x,E,F 

**

輸出

**: -

1,1,A,B 
2,A,B,C 
3,3,C,D 
4,D,E,F,G 
5,5,E,F 

x- is the 2nd column where I would like to assign NR when NF=4 
n - This is the 2nd column. 
+0

請讓這個例子更清楚,是什麼'x'和'N'在輸入?此外你還試過了什麼? – 123

+0

想想你提供的樣品輸入/輸出。你似乎只需要做一些事情,當一個字段是x和NF是4,那麼爲什麼你只發布樣本輸入,每次一個字段是x NF **總是** 4?正如所寫的,有人可能會寫一個解決方案,完全忽略你的要求,只有當NF是4時更改x,並根據你的發佈樣本輸入進行測試,它會產生你的預期輸出。而且你**總是**在你想改變的領域有x,所以我們也可以忽略這個要求。這是一個可怕的例子,甚至不包括覆蓋你的用例! –

+1

例如,我可以發佈一個只是'awk'{sub(/ x /,NR)}'文件'的解決方案,並且在針對您的發佈示例輸入運行時,它會生成您的發佈預期輸出。它當然是完全錯誤的解決方案,所以您的樣本輸入/輸出添加了什麼值?沒有。做出你想要的改變總是很容易的,而要避免改變你不想改變的事情則更加困難,所以在創建示例輸入/輸出時,真的需要付出一些努力來提出你認爲很難做到的事情,至少包括涵蓋最基本要求的案例。 –

回答

2

你的問題不完全是明確。
在awk中,內置變量NFNR分別表示每行中的字段數和記錄/行號。

爲了從給定的輸入所需的輸出,我會做到以下幾點:

1,1,A,B 
2,A,B,C 
3,3,C,D 
4,D,E,F,G 
5,5,E,F 

更新:

awk 'BEGIN{OFS=FS=","}$2=="x"{$2=NR}1' test.txt 

這由行號替換每個x在第二欄:如果要將第二列的內容替換爲NR,如果字段數等於4:

awk 'BEGIN{OFS=FS=","}NF==4{$2=NR}1' test.txt 

輸出:

1,1,A,B 
2,2,B,C 
3,3,C,D 
4,D,E,F,G 
5,5,E,F 
2

嘗試以下操作:

awk -v count=4 -v ndx=2 'BEGIN { FS=OFS="," } NF==count { $ndx = NR } 1' file 

如果如果其原始值是x(要與你的樣本輸出一致)第2場才能更換:

  • -v count=4 -v ndx=2

    傳遞慾望d字段計爲awk變量countawk腳本,並將目標字段的索引作爲變量ndx

  • BEGIN { FS=OFS="," }

    只執行一次,腳本的其餘部分之前,同時設置該輸入字段分隔符(FS)和輸出字段分隔符,使得awk斷輸入到字段以逗號分隔,並且在更改字段值後重建行時使用逗號作爲分隔符。 謝謝,Ed Morton

  • NF==count

    是測試針對count可變字段計數(NF),並執行以下動作({...})僅當這兩個值相等的圖案。

  • { $ndx = NR }

    分配電流(基於1)行索引(NR)到外地與索引ndx,有效地重建新字段值的輸入線。

  • 1

    是一種常見的速記簡單地打印(潛在修改的)輸入線。(1實際上相當於{ print }:模式1不約而同的計算結果爲真實的,因爲它沒有相關的動作,缺省動作踢,這是簡單地打印線)。

相關問題