我在其他問題中檢查了一些解決方案,但它們不適用于我的案例,我被卡住了,所以我們開始吧。我有一個 csv 檔案,我想將其全部轉換為大寫。它必須帶有一個回圈并且最少占用 7 行代碼。我必須使用以下命令運行腳本:
./c_bash.sh student-mat.csv
所以我嘗試了這個腳本:
#!/bin/bash
declare -i c=0
while read -r line; do
if [ "$c" -gt '0' ]; then
sed -e 's/\(.*\)/\U\1/'
else
echo "$line"
fi
((c ))
done < student-mat.csv
我知道可能有一些不必要的事情,但我想專注于 sed 命令,因為它看起來像這里的問題。該腳本顯示了以下輸出:(前 5 行):
school,sex,age,address,famsize,Pstatus,Medu,Fedu,Mjob,Fjob,reason,guardian,traveltime,studytime,failures,schoolsup,famsup,paid,activities,nursery,higher,internet,romantic,famrel,freetime,goout,Dalc,Walc,health,absences,G1,G2,G3
GP,F,17,U,GT3,T,1,1,AT_HOME,OTHER,COURSE,FATHER,1,2,0,NO,YES,NO,NO,NO,YES,YES,NO,5,3,3,1,1,3,4,5,5,6
GP,F,15,U,LE3,T,1,1,AT_HOME,OTHER,OTHER,MOTHER,1,2,3,YES,NO,YES,NO,YES,YES,YES,NO,4,3,2,2,3,3,10,7,8,10
GP,F,15,U,GT3,T,4,2,HEALTH,SERVICES,HOME,MOTHER,1,3,0,NO,YES,YES,YES,YES,YES,YES,YES,3,2,2,1,1,5,2,15,14,15
GP,F,16,U,GT3,T,3,3,OTHER,OTHER,HOME,FATHER,1,2,0,NO,YES,YES,NO,YES,YES,NO,NO,4,3,2,1,2,5,4,6,10,10
GP,M,16,U,LE3,T,4,3,SERVICES,OTHER,REPUTATION,MOTHER,1,2,0,NO,YES,YES,YES,YES,YES,YES,NO,5,4,2,1,2,5,10,15,15,15
現在我看到它起作用了,我想將該 sed 命令永久應用于 csv 檔案,所以我在它后面加上了 -i:
#!/bin/bash
declare -i c=0
while read -r line; do
if [ "$c" -gt '0' ]; then
sed -i -e 's/\(.*\)/\U\1/'
else
echo "$line"
fi
((c ))
done < student-mat.csv
但是輸出而不是應用更改,顯示的是:(前 5 行)
school,sex,age,address,famsize,Pstatus,Medu,Fedu,Mjob,Fjob,reason,guardian,traveltime,studytime,failures,schoolsup,famsup,paid,activities,nursery,higher,internet,romantic,famrel,freetime,goout,Dalc,Walc,health,absences,G1,G2,G3
sed: no input files
sed: no input files
sed: no input files
sed: no input files
sed: no input files
所以在網上查了很多不同的解決方案,我也試著把單引號改成雙引號。
#!/bin/bash
declare -i c=0
while read -r line; do
if [ "$c" -gt '0' ]; then
sed -i -e "s/\(.*\)/\U\1/"
else
echo "$line"
fi
((c ))
done < student-mat.csv
但在這種情況下,它不是應用更改,而是生成一個 0 位元組的檔案。所以當我這樣做時沒有輸出:
cat student-mat.csv
我在這里預期的解決方案是,當我應用此腳本時,它會將所有資料永久更改為大寫。應用腳本后,它應該用命令 cat student-mat.csv 顯示:(前 5 行)
school,sex,age,address,famsize,Pstatus,Medu,Fedu,Mjob,Fjob,reason,guardian,traveltime,studytime,failures,schoolsup,famsup,paid,activities,nursery,higher,internet,romantic,famrel,freetime,goout,Dalc,Walc,health,absences,G1,G2,G3
GP,F,17,U,GT3,T,1,1,AT_HOME,OTHER,COURSE,FATHER,1,2,0,NO,YES,NO,NO,NO,YES,YES,NO,5,3,3,1,1,3,4,5,5,6
GP,F,15,U,LE3,T,1,1,AT_HOME,OTHER,OTHER,MOTHER,1,2,3,YES,NO,YES,NO,YES,YES,YES,NO,4,3,2,2,3,3,10,7,8,10
GP,F,15,U,GT3,T,4,2,HEALTH,SERVICES,HOME,MOTHER,1,3,0,NO,YES,YES,YES,YES,YES,YES,YES,3,2,2,1,1,5,2,15,14,15
GP,F,16,U,GT3,T,3,3,OTHER,OTHER,HOME,FATHER,1,2,0,NO,YES,YES,NO,YES,YES,NO,NO,4,3,2,1,2,5,4,6,10,10
GP,M,16,U,LE3,T,4,3,SERVICES,OTHER,REPUTATION,MOTHER,1,2,0,NO,YES,YES,YES,YES,YES,YES,NO,5,4,2,1,2,5,10,15,15,15
感謝你們對我的幫助。
uj5u.com熱心網友回復:
Sed 適用于檔案,而不適用于行。不要讀取行,在檔案上使用 sed。sed 可以自己排除第一行。請參閱 sed 手冊。
你要:
sed -i -e '2,$s/\(.*\)/\U\1/' student-mat.csv
你可以用s/.*/\U&/.
您的代碼不像您認為的那樣作業。請注意,您的代碼從輸出中洗掉了第二行。您的代碼:
- 讀取第一行
read -r line echo "$line"列印第一行c遞增read -r line讀取第二行- 然后
sed處理檔案的其余部分(從第 3 行到最后)并以大寫形式列印它們 - 然后
c遞增 - 然后
read -r line失敗,回圈退出
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/398480.html
