1

私はCSVファイルのリストを持っています.CSVファイルの最後の列に変数名を(動的に、変更されます)出力する必要があります。

コードは次のとおりです。

addProgramtypeID () {
    for csv in $1
    do
        file_name="$csv"
        echo $file_name
        f=`echo $file_name | cut -d '_' -f3 | cut -d '.' -f1`
        echo $f
        k=`grep -i $f Program_type.csv | cut -d ',' -f3`
        echo $k
        awk '{ print $0 "," "'"$k"'" }' "$csv" > tempfile && mv tempfile "$csv"
    done
}

addProgramtypeID "T_H_EDCGO.csv"

現在、変数値Kは CSV ファイルの 1 列目に出力されており、ファイルの 1 列目の最初の 2 文字も削除されています。私の要件は、変数値が常に CSV ファイルの最後の列になることです。

入力:

TX_ID,SEQUENCE,PROGRAM_ID,CA_ID,C_ID
123,3,334,234,3
545,2,444,456,5

$k=2 出力を想定した場合:

TX_ID,SEQUENCE,PROGRAM_ID,CA_ID,C_ID,2
123,3,334,234,3,2
545,2,444,456,5,2

プログラムの種類.csv

type,desc,id
EDC,Alb,1
EDG,Gsc,2
4

2 に答える 2

0

あなたが望むのはただのようです:

$ cat tst.sh
addProgramtypeID () {
    csv="$1"
    awk -v csv="$csv" '
    BEGIN{ FS=OFS=","; split(csv,csvA,/[_.]/); f=csvA[3] }
    NR==FNR { if ($0 ~ f) { k = $3 }; next }
    { print $0, k }
    ' Program_type.csv "$csv" > tempfile && mv tempfile "$csv"
}

addProgramtypeID "T_H_EDC.csv"

$ cat Program_type.csv
type,desc,id
EDC,Alb,1
EDG,Gsc,2

$ cat T_H_EDC.csv
TX_ID,SEQUENCE,PROGRAM_ID,CA_ID,C_ID
123,3,334,234,3
545,2,444,456,5

$ ./tst.sh

$ cat T_H_EDC.csv
TX_ID,SEQUENCE,PROGRAM_ID,CA_ID,C_ID,1
123,3,334,234,3,1
545,2,444,456,5,1

しかし、投稿されたサンプル入力が投稿された目的の出力を生成できなかったため、わかりにくいため、いくつかを作成する必要がありました。

if ($0 ~ f)おそらくただのはずですが、元のロジックが行うことif ($1 == f)をコピーしただけです。grep f <file>

于 2013-05-17T04:05:22.133 に答える
0

CSV ファイルに問題がないと仮定するとawk、次のように使用できます。

for csv_file in $ALL_MY_FILES
do
    cat csv_file | awk 'BEGIN{FS=","}; {print($(NF))}'
done

または単に

    cat $ALL_MY_FILES |  awk 'BEGIN{FS=","}; {print($(NF))}'

これらは両方とも、すべての csv ファイルの最後の行の列を出力します。各 CSV からの結果は、単に一緒に追加されます (それが本当に必要ですか?)。

困難はawk側にあります。これは、文字列や余分な空白などを完全に認識していません。私の推奨事項は、上記の行を試して、何がうまくいかないか (もしあれば) を確認してから、微調整を開始することです。

于 2013-05-17T04:05:34.360 に答える