私は以下のサンプルエントリを持つ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
私は以下のサンプルエントリを持つ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
これは、などがない文字列リテラルと非常に単純なCSVファイルであれば、あなたは単にhead
とcut
を使用することができます。
#!/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
を処理したいファイルの名前に置き換えてください。このサンプルの変数名以外の変数名を使用することもできます。ここで
は、私は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
に渡されます。
cut
たびにフォークを必要とせずに、より効率的なアプローチ、:
#!/usr/bin/env bash
while IFS=, read -r field1 field2; do
# do something with $field1 and $field2
done < file.csv
利益は、大きなファイルのために非常に相当することができます。
ええ、私の解決策よりもはるかに優れています。 – Aaron
ファイルは基本的なCSVですか、それとも高度な文字列リテラルを計画していますか? –
ここに質問がありますか?私はそれを見ない。何が問題なの? –