2017-01-10 9 views
1

私は以下のサンプルエントリを持つCSVファイルを用意しています。私が望むのは、CSVファイルを1行ずつ読み込み、1つの変数に005、もう1つの変数にIP 192.168.10.1というような別のスクリプトを渡す必要があるというBashスクリプトを書くことです。BashでのCSVファイルの解析

005,192.168.10.1 
006,192.168.10.109 
007,192.168.10.12 
008,192.168.10.121 
009,192.168.10.123 
+0

ファイルは基本的なCSVですか、それとも高度な文字列リテラルを計画していますか? –

+2

ここに質問がありますか?私はそれを見ない。何が問題なの? –

答えて

0

これは、などがない文字列リテラルと非常に単純なCSVファイルであれば、あなたは単にheadcutを使用することができます。

#!/bin/bash 

while read line 
do 
    id_field=$(cut -d',' -f 1 <<<"$line") #here 005 for the first line 
    ip_field=$(cut -d',' -f 2 <<<"$line") #here 192.168.0.1 for the first line 
    #do something with $id_field and $ip_field 
done < file.csv 

次のようにプログラムが動作します。我々は、取得するためにcut -d','を使用その行の最初と2番目のフィールド。私たちはこれをwhile read lineのまわりで包み込み、I/Oリダイレクトを使用して、ファイルをwhileループに送ります。

もちろん、file.csvを処理したいファイルの名前に置き換えてください。このサンプルの変数名以外の変数名を使用することもできます。ここで

+0

このスクリプトを実行するには、CSV内のすべての行について上記を実行するループが必要です。私は上記と同じようにしたいと思う100以上の行があるので – Robin

+0

@Robin:ああ、どういうわけか、すべての行についてこれをやりたいと思っていました。編集を参照してください。 –

+0

これは非常に非効率的です。 – chepner

1

は、私はGNUツールでそれを行うだろう方法は次のとおりです。

while read line; do 
    echo $line | cut -d, -f1-2 --output-delimiter=' ' | xargs your_command 
done < your_input.csv 

while read line; do [...]; done < your_input.csvはラインで、あなたのファイルの行を読み込みます。 各行について、cutは最初の2つのフィールド(CSVなのでコンマで区切られています)に入力し、スペースで区切ってxargsに渡します。これはパラメータとしてyour_commandに渡されます。

+0

これはカンマを切り落とさないので、2つのフィールドはコマンドによって1つのパラメータとして解釈されます。 –

+0

@WillemVanOnsemそうですね、スペースではなくカンマでテストしてください。あなたは '--output-delimiter = '''を使ってこれを解決するのに十分だろうと思いますか? – Aaron

+0

'--output-delimiter = ''' – Aaron

3

cutたびにフォークを必要とせずに、より効率的なアプローチ、:

#!/usr/bin/env bash 

while IFS=, read -r field1 field2; do 
    # do something with $field1 and $field2 
done < file.csv 

利益は、大きなファイルのために非常に相当することができます。

+0

ええ、私の解決策よりもはるかに優れています。 – Aaron