web-dev-qa-db-ja.com

csvファイルの最初の列を新しいファイルに解析する

オペレーティングシステム:OSX方法:コマンドラインから、sed、cut、gawkを使用します。

基本的に、csvファイルの最初の列を取得して、それを新しいファイルに解析しようとしています。

入力ファイルの例

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

欲望の出力

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

だから私は最初の列が欲しい。

これが私がこれまでに試したことです:

awk -F"," '{print $1}' in.csv > out.txt

awk -F"," '{for (i=2;i<=NF;i++)}' in.csv > out.txt

awk -F"," 'BEGIN { OFS="," }' '{print $1}' in.csv > out.txt

cat in.csv | cut -d \, -f 1 > out.txt

最初の行だけを印刷するか、まったく印刷しないかのどちらかで動作するようには見えないため、1行ずつ読み取ることができないと思います。

34
S1syphus

あなたの最後のオプションは私にとって完璧に機能します:

$ cat > in.csv  # Then pasted the example input followed by Ctrl+D:
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
[Ctrl+D]
$ cat in.csv | cut -d, -f1
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

たぶん、ここで行末があなたを噛んでいますか?ファイルにDOSスタイルまたは古いMacスタイルの行末がある場合、これは奇妙な動作を引き起こす可能性があります。 file in.csvを実行して、どのような結果になるかを確認してください。

$ file in.unix.csv
in.unix.csv: ASCII text
$ file in.dos.csv
in.dos.csv: ASCII text, with CRLF line terminators

後者の場合は、dos2unixツールを使用してファイルを変換します。

編集:OS Xでは flipがあなたの望むものです のようです。

40
Thomas

サンプル入力をコピーして貼り付け、in.csvとして保存してから、最初の行を実行しました。

awk -F"," '{print $1}' in.csv > out.txt

そしてそれは次のように完璧に機能しました:

$ emacs in.csv
$ cat in.csv 
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
$ awk -F"," '{print $1}' in.csv > out.txt
$ cat out.txt 
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3

これはOS X 10.5のTerminal.appにあります

12
Personman

私にとって、カットは期待される結果をもたらします:

cut -d, -f1 < in.csv > out.txt
4
Michal Čihař

Perlがオプションの場合:

Perl -F, -lane 'print $F[0]' in.csv > out.txt

次のコマンドラインオプションが使用されます。

  • -n入力ファイルのすべての行をループします
  • -lは、処理前に改行を削除し、後で元に戻します
  • -a autosplitモード–入力行を@F配列に分割します。デフォルトでは空白で分割されます。
  • -e Perlコードを実行する
  • -F autosplit modifier、この場合は,で分割されます

@Fは、$F[0]で始まるインデックスが付けられた、各行の単語の配列です。

0
Chris Koknat