Linux

如何列印包含欄位分隔符的最後一個單詞

  • August 17, 2017

如何列印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,ee,第三個欄位是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 個欄位的行列印一個空行。

引用自:https://unix.stackexchange.com/questions/386622