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

Bash 如何将变量值始终打印为CSV文件中的最后一列,bash,parsing,awk,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_

我有一个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 输出:

程序类型.csv

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

看起来你想要的只是:

$ 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
但很难说,因为您发布的示例输入无法生成您发布的所需输出,所以我不得不补充一些


如果$0~f可能只是$1==f,那么我只是复制了您原始的grep f逻辑的功能。

假设您的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方面。这是完全不知道的事情,如退出字符串
或者额外的空白。我的建议是试试上面这一行,看看有什么地方出了问题,然后开始调整。

请给出预期的输出和相应的小输入。没有例子,你的描述很难理解。我知道您希望在每行末尾添加$k变量。这是正确的吗?是的,最后一列中应该包括$k值。您的脚本有太多错误,我平均每行计算超过1个错误作为起点,让我们从一些示例输入和预期输出开始。请发布Program_type.csv和T_H_EDCGO.csv的小样本,以及在这些文件上运行工具的预期输出。sed s/\$/,$k/file.csv?非常感谢您的评论。这与我的代码类似,没有给出注释的最终结果。但我的问题仍然存在。我怀疑你在Windows中创建了一个或两个输入文件,因此MS在每行末尾免费放置了控件MS,这让你很困惑。请尝试使用cat-v查看它们,然后使用dos2unix删除它们,然后重试解决方案。如果不是这样,请澄清我的问题仍然存在的含义。嗨,Ed,我的输入即T_H_EDCGO.csv放在unix机器上。不在窗户里。我正试图从我的输入文件中查找Program_type.csv文件,并获得我在问题中给出的所需输出。$k变量应打印在csv文件的最后一列中,但目前尚未打印。这就是问题所在。请让我知道这是否能澄清问题。@user2376510-否,请参阅我的评论,尝试我的建议,并修复您的示例输入,以便生成所需的输出。@user2376510我更新了我的答案,以使用我自己的示例输入,以便您可以看到脚本按照我认为您想要的方式工作。不过,再一次,考虑到字符正在消失,几乎可以肯定的是,输入文件中有需要删除的控件Ms,正如我之前所建议的。嗨,阿德里安,我是shell脚本中的noob。请给我一点详细的回答。谢谢Sadrian,非常感谢。我刚刚发现结果集是正确的,正如我所希望的,但是当我在Putty客户端上看到它时,它看起来不同,就好像$k值不是最后一列。我使用ypu发布的脚本获取最后一列,然后我发现代码很好。但是,当我将这个csv文件数据导入SQL表时,出现了一个问题,只有一行被导入,并且所有的值都为零值!!!!将cat文件| awk“脚本”更改为awk“脚本”文件。在开始部分之后,去掉分号。除掉NF周围的帕伦人。去掉$NF左右的paren。使用while IFS=read-r csv_文件而不是中的csv_文件。如果您正在编写脚本文件,我同意这些评论。我很惊讶NF周围的那些参数对我来说都能起作用。@AdrianRatnapala在任何上下文中,你可以在任何变量周围添加任意数量的参数,代码将继续工作,它只是混淆了代码,让人们在阅读代码时浪费时间试图弄清楚它们为什么存在。
    cat $ALL_MY_FILES |  awk 'BEGIN{FS=","}; {print($(NF))}'