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