web-dev-qa-db-ja.com

最後から数えてテキスト行からフィールドを切り取る(選択する)にはどうすればよいですか?

カットコマンドを使用して行からフィールドを選択する方法を知っています。たとえば、次のデータがあるとします。

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

このコマンド:

cut -d, -f2 # returns the second field of the input line

戻り値:

b
g
l

私の質問:最後から2番目のフィールドcountingを選択するにはどうすればよいですか?前の例では、結果は次のようになります。

d
i
n
37
ssn

cutの前後の入力をrevで逆にします。

<infile rev | cut -d, -f2 | rev

出力:

d
i
n
54
Thor

awk でこれを試してください:

awk -F, '{print $(NF-1)}' file.txt

または Perl を使用します:

Perl -F, -lane 'print $F[-2]' file.txt

または Ruby を使用(manatworkに感謝):

Ruby -F, -lane 'print $F[-2]' file.txt

またはbashを使用(manatworkに感謝):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

または python を使用します:

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'
13
Gilles Quenot

Sedの使用:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

出力:

d
i
n

説明

  • ([^,]*,)*は、任意の数の非コンマ文字とそれに続くコンマ、つまり任意の数の列に一致します。
  • ([^,]*)は列に一致します。
  • (,[^,]*){1}は、末尾の1列に一致します。数量詞{1}{2}に変更すると、末尾から2番目の列に一致します。
0
Thor