2010-07-02 60 views
1

$ echo「a b」| awk'{print $ 0; $ 1 = 「1」;打印$ 0}」 A B 圖1b更改列的內容而不破壞格式化

我想收到格式化輸出這樣的:

a  b 
1  b 

有沒有簡單的方法來做到這一點(不IFS,OFS的變化)? 我正在改變大表中的列,然後它看起來很醜。 我不想重新格式化每一列。

謝謝。

回答

2

可能你最好的選擇是後處理輸出。也許這樣簡單:

 
$ ... | awk ... | column -t 

將工作。 (除非通過「我不想格式化每一列」的意思是「我不想重新格式化每一行」,例如「我不想要後處理」。在這種情況下,我會問:「爲什麼不? 「)

+0

THX :)什麼我一直在尋找。 – name 2010-07-02 18:37:31

2

一個可能的答案(假設列的固定數量):

echo "a  b" | awk '{print $0; $1="1"; printf("%s\t%s\n", $1, $2)}' 

另一種可能的答案(假設你沒有一個很好的理由,以避免更改OFS,因爲,你知道,這就是整個POINT有一個!):

echo "a  b" | awk 'BEGIN { OFS="\t" } {print $0; $1="1"; print $0}' 

這第二個有無論多少列你的文本文件工作的優勢具有。


編輯補充:

要解釋爲什麼我覺得你所厭惡的使用OFS是奇怪,這只是你得到的格式變化的全部理由是因爲 OFS。輸出字段分隔符(OFS)默認爲單個空格。當你第一次打印$ 0時,你不會做任何修改,所以$ 0是未改變的行。通過改變你做的記錄之一,Awk重新評估這條線,重新組裝單個字段中的$ 0。重新組裝這個之後,當然,Awk在場之間插入了OFS。因爲這就是它應該做的。從相關手冊頁(man gawk)引用:

將值分配給現有字段會導致在引用$0時重建整個記錄。 同樣,將值賦給$0會導致記錄被重新分割,爲這些字段創建新的值。

現在我同意第一次印刷和第二次印刷之間有點不一致,但這只是語言的方式。除非實際更改字符串,否則OFS不會插入,而是實際計算字段並重建等等。


進一步編輯補充:

關注這些:

$ awk 'BEGIN { printf("|%s|\n", OFS) }' 
| | 
$ awk 'BEGIN { OFS="\t" ; printf("|%s|\n", OFS) }' 
| | 
$ 

是在awk在你的第一個例子中變得更加清晰的行爲,以及理解爲什麼你真正需要的是OFS或者是一個printf之類的東西?

+0

thx爲答案。它真的給這個問題帶來了解。 – name 2010-07-03 13:31:54

1

你也可以使用替代

$ echo "a  b" | awk '{print $0; gsub("^[^ \t]","1"); print $0}' 
a  b 
1  b 
+0

這就是我在開始時所做的,但「|列-t」是更好的方法。 我可以改變任何我想要的列,並在最後仍然有很好的格式化表。 – name 2010-07-03 13:33:13

相關問題