フィールド区切り文字を含む最後の単語を印刷する方法

フィールド区切り文字を含む最後の単語を印刷する方法

word3,a,b,c,d,eフィールド区切り文字()を含む最後のフィールドを印刷するには,

  • 1行に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 

ベストアンサー1

したがって、最後のフィールドword1,word2,word3,a,b,c,d,eeで、3番目のフィールドはですword3。 3番目のフィールドから始まる行部分が欲しいようです。以下を使用する方が簡単ですcut

$ echo word1,word2,word3,a,b,c,d,e | cut -d , -f 3-
word3,a,b,c,d,e

-f 3--f x-yx〜yフィールドに適用されますが、省略されて3番目のフィールドから最後のフィールドにy移動します。

行に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}

最初の2つのフィールドを削除して削除された行のみを印刷する場合と同様に、awkprettificationとして使用されます。sedsed -n 's/^[^,]*,[^,]*,//p'

または:

$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,?[^,]*,?/, "")'


c
c,d

3つ未満のフィールドを持つ行に空白行を印刷します。

おすすめ記事