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

标签 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

我需要检查 Location 和 Way 并将它们转换为 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。目前这只写更正值而不是整行连同更正值。 [不确定如何遍历每行中的单元格值更正需要更正的值,然后复制整行]

任何帮助都是有用的。

最佳答案

参见 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 的 模块

关于linux - Bash:解析 CSV 并编辑单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003016/

相关文章:

linux netlink结构体成员定义

bash - 概括 awk 函数

bash - 将字母数字字符串插入文本文件中的某个单词后(密码/sed/awk)

regex - 当扩展正则表达式 (ERE) 选项与 sed 一起使用时,为什么美元不匹配文字美元?

xcode - 使用 NSTask 启动启动 Node.JS 的 shell 脚本

linux - 使用 Sed 从文本文件中删除一行

php - xampp 开发 : creating project(folders and files) in htdocs folder

linux - block 文件写入的优点是什么

Linux密码命令: formatting the ouput

macos - 在 Macos 上的 bash 中获取午夜前的格式化时间