2017-07-10 36 views
0

我是新來的bash腳本 我有以下的CSV擊:解析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

請[代碼格式和樣本輸入/輸出正確]( http://meta.stackexchange.com/a/22189/248777)。 – mklement0

+1

學** **之前使用http://shellcheck.net **您的代碼在這裏;-)。當你使用shellcheck時,你需要在第一行包括一個合適的「she-bang」行,通常是'#!/ bin/bash'。祝你好運。 – shellter

回答

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利用第四字段
  • s/[^,]*/\U&/3利用的僅首字母第3場所有字母
  • s/[^,]*/\U&/2第2場所有字母大寫

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

+0

嗨Sundeep, 它對Gedit :)有效,謝謝,問題出在MobaXterm編輯器上,我可以知道\ L \ u表示如何在一個單詞中大寫第一個字母嗎? –

+0

'\ L'將所有字母小寫....'\ u'只會大寫一個字母......如果您的輸入只有像'mon','tue'等字樣,您可以跳過使用'\ L' – Sundeep

+0

謝謝,我又換了一個字母懷疑,如果你想要我打開另一個線程我會這樣做。我有時候在100,西孟加拉邦,上週四,週四, 101,,Fri,6.00,8.00,P3。我有這個表達式s /,[[:blank:]] *,/ ,, /。這工作正常。但是,當分隔符之間存在多於1個空格時,它不起作用 –

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 
+0

標題需要被複制。我可以在什麼地方插入這條線。目前,它給了我一個錯誤,說「多重調用二進制」用法:awk [options] [awk_program] [file] ... -v var = val設置變量 –

+0

@MeghnaSathyanarayan:不明白你的意思與插入。在這裏上面的代碼必須被執行(沒有插入) – mauro

+0

抱歉Mauro,我重構了我的問題,我執行了命令並發現了錯誤,我認爲它應該被添加到現有腳本的某個地方。因此我可能混亂了 –

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