Bashパラメータ$ 1を使用して、このawk列2セレクタをどのように拡張しますか?

Bashパラメータ$ 1を使用して、このawk列2セレクタをどのように拡張しますか?

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番目の列が欲しい

pasteAwkと(シェルファイルのグロービングと共に)の組み合わせを使用すると、これを最も簡単に実行できます。

paste -d, input[123].csv | awk -F, -v OFS=, '{print $2, $4, $6}'

これらの仮定が間違っている場合は、誤った入力/出力の例を非難してください。 ;)

答え2

記載されているようにあなたの質問に答えるには

$ cat file
a,b,c
d,e,f
g,h,i
j,k,l

そして簡単なテストスクリプト

$ cat col.bash
#!/bin/bash

awk -F, -vcol="$1" '{print $col}' file

$col必須列が実際に参照されていることを確認できます。

$ ./col.bash 2
b
e
h
k

あなたの場合、これがうまくいかないと他の要因が働きます。とにかく、複数のファイルから列を抽出する簡単な方法があります。

答え3

この状況では、BashとAWKを使用するのは非常に難しいでしょう。ここで提案されたソリューションでは問題を解決できません。"/ /...問題がたくさん発生するため、'ここでツールが必要です。

gawkスレッドの説明に従って使用ECG Bashセレクタ

# https://codereview.stackexchange.com/a/146370/122105
#!/usr/bin/gawk -f

# https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html
@include "join.awk"

BEGIN {
    FS = "\"*,\"*";
    last_row = 0;
}

BEGINFILE {
    rows[0][ARGIND] = gensub(".*P([0-9]*)C.*", "\\1", "g", FILENAME);
}

{
    rows[FNR][ARGIND] = $col;
    if (FNR > last_row) { last_row = FNR; }
}

END {
    for (r = 0; r <= last_row; r++) {
        print join(rows[r], 1, ARGC - 1, ",");
    }
}

完全な答えを読んでください200_success ここ良い説明があります。

関連情報