2017-06-18 28 views
0

我已經試過這樣:無法設置字段分隔符在AWK,與路徑問題帶空格

echo -e '1 \t 2 \t 3 \t 4' | awk -F"\t" '{print "$3="$3, "$4="$4}' 

而且這工作完全正常。

不過,我一直有問題,當我嘗試這樣做:

aux1=`echo $i | awk -F"\t" '{print $11}'` 

或本:

aux1=`echo $i | awk 'BEGIN{FS="\t"}{print $11}'` 

其中 「i」 是 「發現」 和「輔助1輸出「應該存儲一條路徑。

問題是,如果我不嘗試更改默認字段分隔符,那麼每個有空格的路徑都會出錯,但是如果我這樣寫,那麼我只是得到「用法「來自awk的消息存儲在」aux1「中,因爲顯然我做錯了什麼。

如果我把它寫這樣的代替(但不嘗試設置FS)爲「作品」,但在他們的空間的路徑沒有完成:

aux1=`echo $i | awk '{print $11}'` 
+0

'aux1 = \'echo -e $ i | awk -F「\ t」'{print $ 11}'\'' - 這適用於我。你能舉例說明你遇到問題嗎? –

+0

/家庭/巴勃羅/桌面/測試/測試\文件夾/ insideFolder 如果我能在這條道路的 「i」,然後我只是要得到 /家庭/巴勃羅/桌面/測試/測試\ 在aux1 – Pabloneto

+0

我仍然沒有看到任何問題。這給了我正確的路徑'i =「field1 \ t field2 \ t/home/pablo/Desktop/test/test \ folder/insideFolder」; aux1 = \'echo -e「$ i」| awk -F「\ t」'{print $ 3}'\'; echo $ aux1'。你能粘貼你收到的錯誤嗎? –

回答

1

find . -ls輸出不使用標籤分隔領域,但空間。你可以檢查一下:

find . -ls | od -c 

所以,這是毫無意義的嘗試與標籤作爲字段分隔東西,因爲沒有任何。

只有空格,並且無法區分分隔兩個字段的空格和文件名內的空格。

由於路徑開始於場數11和延伸直到該行的末端,一個非常難看的解決方法是:

echo "$i" | awk '{for (i = 11; i <= NF; i++) { printf "%s ", $i; } printf "\n"}' 

此打印從11開始,直到每個的最後字段的所有字段線,由空格隔開。如果路徑包含一個或多個非連續空格,則此解決方案可以正確重建它。但是,如果路徑包含例如一行中的兩個空格,則此解決方案將錯誤地僅打印一個而不是兩個空格。


注:

在你的問題,你用echo $i沒有引號,而不是echo "$i"。請注意,報價在這裏絕對是必需的,否則所有換行符都將被空格替換,並且您甚至無法區分字段中的記錄。


如果你想有一個清晰的解決方案的話,最好保存不同類型的數據在i,例如只有路徑(每行一個):

i=$(find .) 

然後,可以例如由場分離器設置爲\n和禁用記錄分隔符提取單個路徑:

echo "$i" | awk -vFS="\n" -vRS="" '{print $3}' 

這將打印完整的第三條路,不管它是否包含空格。