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 文件的第一列,它也正在删除文件中第一列的前 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

Program_type.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一边。这完全不知道诸如quitd字符串或额外空格之类的东西。我的建议是尝试上面的代码,看看哪里出了问题(如果有的话),然后开始调整。

于 2013-05-17T04:05:34.360 回答