簡體   English   中英

Bash:解析CSV並編輯單元格值

[英]Bash: Parse CSV and edit cell values

我是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 Day需要是mon-Mon我需要針對整個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。 當前,這僅將校正后的值寫入,而不會寫入整行。 [不確定如何遍歷每一行中的單元格值來糾正需要糾正的值,然后復制整行]

任何幫助將是有用的。

請參閱為什么使用shell循環處理文本被認為是不良做法?

問題被標記為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\u0026amp;/4僅將第4個字段的首字母大寫
  • s/[^,]*/\\U&/3第三個字段中的所有字母大寫
  • s/[^,]*/\\U&/2第二個字段中的所有字母大寫

如果字段本身可以包含,雙引號引起等等,請使用具有csv模塊的perlpython

回想一下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

我假設您在輸入中包含無標題的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM