我寫了一個shell腳本來獲取任何列。 腳本是:如何將幾個shell變量傳遞給shell腳本中的awk?
#!/bin/sh
awk '{print $c}' c=${1:-1}
,這樣我可以把它作爲
ls -l | column 2
但我怎麼實現它的多個列? 說,那我想是這樣的:
ls -l | column 2 3
我寫了一個shell腳本來獲取任何列。 腳本是:如何將幾個shell變量傳遞給shell腳本中的awk?
#!/bin/sh
awk '{print $c}' c=${1:-1}
,這樣我可以把它作爲
ls -l | column 2
但我怎麼實現它的多個列? 說,那我想是這樣的:
ls -l | column 2 3
在這種情況下,我不會AWK使用在所有:
columns() { tr -s '[:blank:]' ' ' | cut -d ' ' -f "[email protected]"; }
這使用tr
到空白的所有序列擠一個空格,然後cut
提取你感興趣的領域。
ls -l | columns 1,5,9-
ls -l | nawk -v r="3,5" 'BEGIN{split(r,a,",")}{for(i in a)printf $a[i]" ";print "\n"}'
現在,你可以簡單地改變你的r
變量在shell腳本,並把它傳遞。 或者您可以在您的shell腳本中配置它並使用r=$your_list_var
將使用awk命令打印$your_list_var
中的字段編號。 上面的示例輸出ls -l
輸出的第3個和第5個字段。
+1,但是將'split'放在'BEGIN'塊中,所以你不必爲每一行都做。 –
是的,你是對的。更新答案 – Vijay
當輸入文件包含printf格式化字符時,將會以加密方式失敗,並且不一定按輸入順序或參數順序輸出字段。它還會在每行的末尾添加一個空格,並在每個輸出行之間添加一個虛假的換行符。 –
awk -v c="3,5" '
BEGIN{ split(c,a,/[^[:digit:]]+/) }
{ for(i=1;i in a;i++) printf "%s%s", (i==1?"":OFS), $(a[i]); print "" }
'
使用您想要的任何非數字作爲列號分隔符(例如逗號或空格)。
+1爲正確的解決方案。我可能會使用'tr -s'[:blank:]''\ t'',這樣你就不需要在剪切的參數中指定'-d'''但是nbd。 –