我是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。目前,这仅写入校正值而不是整行以及校正值。 [不确定如何通过每行中的单元格值循环来纠正需要校正的单元格,然后复制整行]
任何帮助都会有用。
答案 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
将第二个字段中的所有字母大写如果字段本身可以在双引号中包含,
,依此类推,请使用perl
,python
等具有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