如何将变量值始终作为CSV文件中的最后一列打印

时间:2013-05-17 03:13:14

标签: bash parsing awk

我有一个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列打印,它也会删除文件中第一列的前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

2 个答案:

答案 0 :(得分: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>逻辑所做的事情。

答案 1 :(得分: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方面。这完全不知道像退出字符串之类的东西 或额外的空白。我的建议是尝试上面的行,看看出了什么问题(如果有的话),然后开始调整。