2013-05-17 70 views
1

我有一个CSV文件的列表,我必须在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" 

截至目前正在被打印在CSV文件的第一列中的变量值K,也被在文件中移除所述第一列的第一的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 
+1

请给出预期的输出和相应的(平凡)输入。没有例子,你的描述很难理解。我知道你想在每行的末尾添加'$ k'变量。它是否正确? – Lynch

+0

是的,最后一列中应该包含$ k值。 – user2376510

+2

你的脚本有太多的错误(我平均每行计算的错误数超过1个)用作起点,让我们从一些示例输入和预期输出开始。请发布一个小样本的Program_type.csv和T_H_EDCGO.csv,以及在这些文件上运行工具的预期输出。 –

回答

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>

+0

感谢评论Ed。但我的问题依然存在。 – user2376510

+2

我怀疑你在Windows中创建了一个或两个你的输入文件,所以MS已经在每一行的结尾处提供了免费的control-Ms,这就是搞砸你的东西。尝试'cat -v'来查看它们,然后'dos2unix'去除它们,然后再次尝试解决方案。如果不是这样,那就澄清一下“我的问题依然存在”的含义。 –

+0

嗨Ed,我的输入,即“T_H_EDCGO.csv”放在unix机器上。 (不在窗口中)。我正在试着从我的输入文件中查找Program_type.csv文件,并按照我在问题中给出的方式输入所需的输出。 $ k变量应该打印在csv文件的最后一列,目前还没有发生。这是问题。如果澄清,请让我知道。 – user2376510

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方。这完全不知道诸如已退出的字符串 或多余的空格。我的建议是尝试上面的行,看看出了什么问题(如果有的话),然后开始调整。

+0

嗨阿德里安,我在shell脚本noob。请给我提供一些详细的答案。谢谢 – user2376510

+0

阿德里安,非常感谢。我只是想通过结果集正确地按照我想要的方式进行,但是当我在Putty客户端上看到它时,它看起来不同(即,如果$ k值不是最后一列)。我使用了ypu发布的脚本来获得最后一列,然后我发现代码很好。但是,当我将这个csv文件数据导入到SQL表中时,就会出现这样的问题,只有一行也会被导入到所有的零值中。 !!!! – user2376510

+0

更改'cat file | awk'脚本'到'awk'脚本文件。在BEGIN部分之后摆脱分号。去掉NF附近的人。摆脱$ NF附近的人群。使用'while IFS = read -r csv_file'而不是'for csv_file in'。 –

相关问题