Linux
如何列印包含欄位分隔符的最後一個單詞
如何列印
word3,a,b,c,d,e
包含欄位分隔符的最後一個欄位(),
?
- 在每一行中,我們只有 3 個單詞/字元串,如下結構
類型、參數、值
但該值可以包括未轉義的欄位分隔符本身。來自行的範例:
echo word1,word2,word3,a,b,c,d,e | awk -F "," '{print $3}'
它的印刷品:
word3
預期成績:
word3,a,b,c,d,e
另一個例子
echo 32637,921763.373,str84,str42,struj,str56,str65 | awk -F "," '{print $3}'
預期成績:
str84,str42,struj,str56,str65
好吧,最後一個欄位
word1,word2,word3,a,b,c,d,e
是e
,第三個欄位是word3
。看起來您想要從第三個欄位開始的那部分行。它更容易cut
:$ echo word1,word2,word3,a,b,c,d,e | cut -d , -f 3- word3,a,b,c,d,e
-f 3-
用於-f x-y
欄位 x 到 y,但y
省略,所以它是從第 3到最後一個欄位。請注意,它假定這些行至少包含 3 個欄位。它將為包含 2 個欄位的輸入行提供空輸出行,如果它不包含逗號,則保持該行不變(您可以添加一個
-s
選項以跳過非定界行):$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -d , -f 3- a c c,d $ printf '%s\n' a a,b a,b,c a,b,c,d | cut -sd , -f 3- c c,d
使用
awk
,您可以執行以下操作:$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,[^,]*,/, "")' c c,d
(
awk 'sub(/^([^,]*,){2}/, "")'
雖然是 POSIX 的變體,但移植性較差,因為仍有一些awk
實現不支持{x,y}
regexp 運算符)要刪除前 2 個欄位(並且只列印它們已被刪除的行),儘管這將
awk
用作美化sed
,因為它與sed -n 's/^[^,]*,[^,]*,//p'
.或者:
$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,?[^,]*,?/, "")' c c,d
為少於 3 個欄位的行列印一個空行。