Bash:解析CSV并编辑单元格值

时间:2017-07-10 02:35:20

标签: linux bash shell csv

我是bash脚本新手 我有以下CSV

输入

ID Location Way Day DayTime NightTime StandNo
1  abc      Up  mon 6.00     18.00    6

预期产出

ID Location Way Day DayTime NightTime StandNo
1  ABC      UP  Mon 6.00     18.00    6

我需要检查位置和方式并将它们转换为UpperCase - ABC,UP 日需要周一至周一 我需要为整个CSV执行此操作。我需要更正值并将所有字段写入CSV或编辑当前单元格并保存CSV 我的脚本如下

file = "Myfile.csv"
while IFS="," read line
do
output=`echo $line | cut -d "," -f2`
echo $output
for i in $output
do
if [ -z $(echo $I | sed -e "s/[a-z]//g") ]
then 
echo $I | tr "[:lower:]" "[:upper:]" >> ".tempfile.CSV"
fi
done
done <$file

'1。目前,这仅写入校正值而不是整行以及校正值。 [不确定如何通过每行中的单元格值循环来纠正需要校正的单元格,然后复制整行]

任何帮助都会有用。

3 个答案:

答案 0 :(得分:3)

请参阅Why is using a shell loop to process text considered bad practice?

问题标记为linux,假设GNU sed可用。而且输入实际上是csv,而不是空格/制表符分隔

$ cat ip.csv 
ID,Location,Way,Day,DayTime,NightTime,StandNo
1,abc,Up,mon,6.00,18.00,6
2,xyz,down,TUE,2.32,5.23,4

$ sed '2,$ {s/[^,]*/\L\u&/4; s/[^,]*/\U&/3; s/[^,]*/\U&/2}' ip.csv 
ID,Location,Way,Day,DayTime,NightTime,StandNo
1,ABC,UP,Mon,6.00,18.00,6
2,XYZ,DOWN,Tue,2.32,5.23,4
  • 2,$处理从第二行到文件末尾的输入
  • s/[^,]*/\L\u&/4仅使用第4个字段的第一个字母
  • s/[^,]*/\U&/3将第3个字段中的所有字母大写
  • s/[^,]*/\U&/2将第二个字段中的所有字母大写

如果字段本身可以在双引号中包含,,依此类推,请使用perlpython等具有csv个模块的

答案 1 :(得分:1)

回想一下,在bash中,您有一个参数扩展,它会将变量中的所有字符(例如$line)转换为大写。扩展的形式为${line^^}(请注意'^^')。要在第一个到大写之后读取和转换行中的所有字符,您可以执行以下操作:

declare -i c=0
while read -r line; do 
    if [ "$c" -gt '0' ]; then 
        echo "${line^^}"          ## output line converted to upper
    else
        echo "$line"
    fi
    ((c++))
done < file.txt

示例输出

$ declare -i c=0; while read -r line; do if [ "$c" -gt '0' ]; then \ 
echo "${line^^}"; else echo "$line"; fi; ((c++)); done < file.txt
ID Location Way Day DayTime NightTime StandNo
1  ABC      UP  MON 6.00     18.00    6

答案 2 :(得分:0)

我假设你在输入中有一个无头的CSV文件:

$ cat file.csv 
1,abc,Up,mon,6.00,18.00,6

我还假设你想要输出一个CSV文件。

如果所有这些假设都是正确的,那么:

$ awk -F, -v OFS=, '{$2=toupper($2); $4=toupper(substr($4,1,1)) substr($4,2); print}' file.csv
1,ABC,Up,Mon,6.00,18.00,6

修改即可。 如果你想保留标题行......

awk -F, -v OFS=, '{if(NR>1){$2=toupper($2); $4=toupper(substr($4,1,1)) substr($4,2)} print}' file.csv
ID,Location,Way,Day,DayTime,NightTime,StandNo
1,ABC,Up,Mon,6.00,18.00,6