$ echo「a b」| awk'{print $ 0; $ 1 = 「1」;打印$ 0}」 A B 圖1b更改列的內容而不破壞格式化
我想收到格式化輸出這樣的:
a b
1 b
有沒有簡單的方法來做到這一點(不IFS,OFS的變化)? 我正在改變大表中的列,然後它看起來很醜。 我不想重新格式化每一列。
謝謝。
$ echo「a b」| awk'{print $ 0; $ 1 = 「1」;打印$ 0}」 A B 圖1b更改列的內容而不破壞格式化
我想收到格式化輸出這樣的:
a b
1 b
有沒有簡單的方法來做到這一點(不IFS,OFS的變化)? 我正在改變大表中的列,然後它看起來很醜。 我不想重新格式化每一列。
謝謝。
可能你最好的選擇是後處理輸出。也許這樣簡單:
$ ... | awk ... | column -t
將工作。 (除非通過「我不想格式化每一列」的意思是「我不想重新格式化每一行」,例如「我不想要後處理」。在這種情況下,我會問:「爲什麼不? 「)
一個可能的答案(假設列的固定數量):
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之類的東西?
thx爲答案。它真的給這個問題帶來了解。 – name 2010-07-03 13:31:54
你也可以使用替代
$ echo "a b" | awk '{print $0; gsub("^[^ \t]","1"); print $0}'
a b
1 b
這就是我在開始時所做的,但「|列-t」是更好的方法。 我可以改變任何我想要的列,並在最後仍然有很好的格式化表。 – name 2010-07-03 13:33:13
THX :)什麼我一直在尋找。 – name 2010-07-02 18:37:31