2010-04-09 255 views

回答

239

「F」 是一個命令行參數不awk的語法,請嘗試:

echo "1: " | awk -F ":" '/1/ {print $1}' 
+21

Ignorant的問題在這裏:/ 1/part是告訴awk只處理包含數字1的行的行(或記錄更精確)嗎? – rantsh 2013-03-21 19:13:05

+0

@rantsh正好 – rightfold 2014-12-17 13:16:43

12

-F是參數爲awk本身:

$echo "1: " | awk -F":" '/1/ {print $1}' 
1 
+0

無需引用冒號。 – ceving 2017-04-10 10:35:26

46

如果你想以編程方式做到這一點,你可以使用FS變量:

echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }' 

請注意,如果您在主迴路,而不是BEGIN循環改變它,它需要爲下一個影響行讀入,因爲當前行已被拆分。

1

沒有必要寫這麼多。只需在awk命令中使用-F選項將所需的字段分隔符與想要打印的列號按照您提到的字段分隔符分隔。

echo "1: " | awk -F: '{print $1}'  
1 

echo "1#2" | awk -F# '{print $1}' 
1 
3

AWK作品文本翻譯是去面向行整個文檔是去fieldwise每行因此$ 1,$ 2 .. $ n爲每條線($ 1場的參考是第一場,2美元是第二場,等等......)。 您可以通過在命令行下使用「-F」開關或使用「FS = ...」在兩個括號內定義字段分隔符。 現在考慮「JUERGEN」的答案:

echo "1: " | awk -F ":" '/1/ {print $1}' 

上方的字段boundries通過設置「:」所以我們有個域中$ 1爲「1」和$ 2這是空space.After,來了正則表達式「/ 1 /」指示過濾器僅當解釋器偶然發現包含這種表達式的行(我的意思是1)時才輸出第一個字段; 的「回聲」命令的輸出是一個行containes「1」,因此該過濾器將工作...

當與下面的例子中進行處理:

echo "1: " | awk '/1/ -F ":" {print $1}' 

的語法是凌亂和解釋器選擇忽略部分F「:」 並切換到默認字段分離器,這是空的sapce,因此輸出「1:」作爲第一個字段,並且不會有第二個字段!

JUERGEN的答案包含良好的語法...

7

您有多種方法來設置:作爲分隔符:

awk -F: '{print $1}' 

awk -v FS=: '{print $1}' 

awk '{print $1}' FS=: 

awk 'BEGIN{FS=":"} {print $1}' 

他們全部是等價的,對於將返回1一個樣本輸入 「1:2:3」:

$ awk -F: '{print $1}' <<< "1:2:3" 
1 
$ awk -v FS=: '{print $1}' <<< "1:2:3" 
1 
$ awk '{print $1}' FS=: <<< "1:2:3" 
1 
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3" 
1 
4

您也可以使用正則表達式作爲字段分隔符,以下內容將通過使用正則表達式將「10」號設置爲分隔符來打印「條」。

echo "foo 10 bar" | awk -F'[0-9][0-9]' '{print $2}' 
1

或者你可以使用:

echo "1: " | awk '/1/{print $1-":"}' 

這是非常有趣的公式。

相關問題