最後から数えてテキスト行からフィールドを切り取る(選択する)方法は?


32

cutコマンドを使用して行からフィールドを選択する方法を知っています。たとえば、次のデータが与えられた場合:

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番目のフィールドを選択するにはどうすればよいですか?前の例では、結果は次のようになります。

d
i
n

参照してくださいstackoverflow.com/q/4304917/789593
NN

回答:


52

前と後の入力を逆にcutしてrev

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

出力:

d
i
n

1
binフォルダに小さなスニペットがたくさんあります。rcutはまさにこれです:#!/ bin / bash rev | 「$ @」をカット| rev
ジョンオールサップ

2
cut負のフィールドインデックス(Pythonなど)を取ることができないのは残念です。
キース・デベンズ

10

これを試してみてください:

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

またはを使用:

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

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

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

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

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

またはを使用:

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

1
bashこのための固定列数は必要ありません:while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt
マナトワーク

1
ところで、で変更perlした場合、3番目のソリューションも機能しrubyます。
マナトワーク

ありがとう、ruby追加、bash編集。
ジルケノー

1
4番目のフィールドが-orで始まる場合(環境、シェル、またはシェルのコンパイル方法に応じて)、バックスラッシュ文字が含まれる場合はecho、オプションではありません。なぜあなたはそれを与える前に何もcat交わる必要file.txtないpython!?。in およびのread -A代わりに必要です。負の添字はで機能しますが、との最近のバージョンでのみ機能します。古いバージョンでは、使用することができますread -aksh93zshzshksh93bash${d: -2:1}
ステファンChazelas

2
@StephaneChazelas、${d[@]: -2:1}あなたの最後の文の意味だと思います。
マナトワーク

0

sedの使用:

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

出力:

d
i
n

説明

  • ([^,]*,)* コンマが続く任意の数の非コンマ文字、つまり任意の数の列に一致します。
  • ([^,]*) 列に一致します。
  • (,[^,]*){1}数量詞{1}を変更{2}して末尾から2番目の列に一致する場合など、末尾の1つの列に一致します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.