csvの最後の要素を検索する

csvの最後の要素を検索する

以下のようにCSVファイルがあります。

input.csv
1,2,3
4,5,6,7,8
9,10,11,12

これからやりたい

output.csv
3
8
12

特定の固定サイズ列に使用できることを知っています。

cut -d \, -f 1 >output.csv

このバーは場所が多様で見つけられません。助けてくれてありがとう。よろしくお願いします。

答え1

1つの解決策は次のとおりです。

awk -F "," '{print $NF}' input.csv > output.csv

答え2

awk -F, '{print $NF}'すでに与えられているように、この場合に最適です。


他の方法:

行を反転して最初の列をインポートしてから、反転できます。

$ rev input.csv | cut -d, -f1 | rev
3
8
12


使用sed

$ sed 's/.*,\(.*\)/\1/' input.csv 
3
8
12


使用greppcre

$ grep -oP '.*,\K.*' input.csv  
3
8
12

答え3

最後のフィールド自体にカンマが含まれている場合は、実際にCSVファイルを解析できるものを使用することをお勧めします。

13,14,15,"this, here"

最後のフィールドはthis, here、ではありません。here"

私はPythonを使用します。スクリプトに入れるか、コマンドラインからスクリプトを偽にすることができます。

python <(cat <<EOSCRIPT
import sys
import csv
f = csv.reader(open(sys.argv[1]))
for row in f:
  print row[-1]
EOSCRIPT
) input.csv > output.csv 

答え4

問題のCSVデータは珍しいCSVファイル(ヘッダーがなくレコードごとのフィールド数が異なる)なので、ヘッダーを含む5つのフィールドを持つより一般的なCSVファイルを使用することを選択しました。

$ mlr --icsv --omd cat file
初めて 2位 3番目の場所 4位 5番目の場所
1 2 サム 4 5
カンマ付きフィールド 第二 D 第二
6 7 8 9 0x0A
第二 D こんにちは世界
1st,2nd,3rd,4th,5th
1,2,3,4,5
"field with, comma",B,C,D,E
6,7,8,9,0x0A
A,B,C,D,"Hello, world"

次のように、名前で最後の列を抽出できます。

$ mlr --csv cut -f '5th' file
5th
5
E
0x0A
Hello, world

...または以下のようにフィールド番号で:

$ mlr --csv -N cut -f 5 file
5th
5
E
0x0A
Hello, world

...または最後のフィールドを選択して目的のフィールドを選択します。

$ mlr --csv -N put -q 'print $[NF]' file
5th
5
E
10
Hello, world

-N上記の最後の2つのコマンドのオプションに注意してください。これはmlr、データをヘッダーなしのCSVファイルに読み込むように指示します。これにより、名前ではなく数字でフィールドを参照できます。


明らかに、問題のような不規則なCSVファイルを引き続き使用できます。mlr入力が「不規則」であることを知らせるだけです。

$ mlr --csv --ragged -N put -q 'print $[NF]' file
3
8
12

関連情報