Bash入力パラメータを使用してBashスクリプトを関数にしようとしていますが、AWK構文が問題を引き起こしています。オリジナルAWKコード
http://stackoverflow.com/a/19602188/54964
awk -F "\"*,\"*" '{print $2}' textfile.csv
Bashパラメータを含む擬似コード$1
file=$(awk -v colN="$1" -F "\"*,\"*" '{print $"${colN}"}' "${input}")
# http://stackoverflow.com/a/19602188/54964
# http://stackoverflow.com/a/19075707/54964
問題は部品にありますprint $"${colN}"
。
現在の出力は2番目の列をキャプチャできず、行全体を占有します。
-0.21,-0.245
-0.205,-0.22
print $colN
の値にかかわらず、常に最初の列を使用するので、それを持つことは正しくありません$1
。
bash code.bash 2
私はそれをユースケースまたは完全なスクリプトと呼ぶために。を使用します。ここ2番目の列の結合結果を得るために、選択したい列(1/2)を両方の列CSVファイルにハードコードしていない場合に機能します。
#!/bin/bash
ids=(101 118 201)
dir="/home/masi/Documents/CSV/"
index=0
for id in "${ids[@]}";
do
input=$(echo "${dir}P${id}C1.csv")
# take second column of the file here
file=$(awk -v colN="$1" -F "\"*,\"*" '{print $colN}' "${input}") # http://stackoverflow.com/a/19602188/54964 # http://stackoverflow.com/a/19075707/54964
Ecgs[${index}]="${file}"
index=$index+1
done
複数列の入力 1.csv 2.csv 3.csv
-0.21,-0.245
-0.205,-0.22
希望の出力
101,118,201
-0.245,-0.245,-0.245
-0.22,-0.22,-0.22
オペレーティングシステム:Debian 8.5
Bash 4.30
ベストアンサー1
入力例には、すべてのファイルの最初と2番目のフィールドに同じ値があります(すべてのファイルに対して同じ値)、これは正確なユースケースを理解するのに実際には役に立ちません。結局のところ、同じ値を3回望み、入力ファイルのすべてのフィールドからそれを取得できる場合は、他の2つのファイルを確認する必要さえありません。以下を使用できます。
cut -d, -f2 input.csv | paste -d, - - -
もちろん、これは実際の入力には適用されず、サンプル入力にのみ適用されます。 (この種の問題に対するサンプル入力/出力を改善する努力の一環として、たくさん.)
仮定すると:
- 常に正確に3つの入力ファイルがあります。
- 呼ぶ
input1.csv
,input2.csv
,input3.csv
- 各列には正確に2つの列があります。
- 各ファイルの2番目の列が欲しい
paste
Awkと(シェルファイルのグロービングと共に)の組み合わせを使用すると、これを最も簡単に実行できます。
paste -d, input[123].csv | awk -F, -v OFS=, '{print $2, $4, $6}'
これらの仮定が間違っている場合は、誤った入力/出力の例を非難してください。 ;)