2017-07-10 8 views
0

値Iは私が場所をチェックする必要があり、次の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 

を持っているのbashスクリプト に新しいですし、ウェイとそれらをUpperCaseに変換する - ABC、UP 日は月曜日にする必要があります - 月 私は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は、次のように私のスクリプトがあるCSV を保存する必要があります。現時点では、補正された値だけでなく、補正された値と共に行全体ではなく、書き込まれます。 [すべての行のセル値をどのようにループして訂正が必要な行を修正し、行全体をコピーするのかわからない]

助けが役に立ちます。

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

を参照してください。そして、入力が実際にcsvで、スペース/タブは、ファイル

  • s/[^,]*/\L\u&/4の最後に2行目からの入力を処理するために

    $ 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/[^,]*/\U&/3を生かします第3フィールドのすべての文字
    • s/[^,]*/\U&/2第2フィールドのすべての文字を大文字にする

    フィールド自体はbashでcsvモジュール

  • +0

    こんにちはSundeep、 をそれは。おかげで:) Geditの上で働いていた。問題はMobaXtermエディタを使用していた。私は、\ Lの\ uが単語の最初の文字を大文字示してどのようにKNWすることはできますか? –

    +0

    '\ 'L'すべての文字を小文字にします.... '\ u'は大文字で1文字だけです...入力に' mon'、 'tue'などの単語しかない場合は、' \ L'を使用してスキップできます – Sundeep

    +0

    ありがとう、あなたが私を望むならば私はそうする別のスレッドを開く。私はこの事件を時々、西ベンガル、アップ、木、、、、。 101、、、Fri、6.00,8.00、P3。私はこの式s /、[[:blank:]] *、/ ,, /を見ています。これは正常に動作します。スペースは最後の二つの区切り文字の間に存在する - しかし1つの以上の空白スペースが区切り文字の間に存在するとき、それはEX 100については –

    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 
    

    EDIT。 あなたのヘッダ行を保持したい場合は...質問がGNU sedが利用可能であると仮定すると、linuxタグ付けされたよう

    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 [オプション] [awk_program] [ファイル] ... -v VAR = valの設定変数 –

    +0

    @MeghnaSathyanarayan:あなたが挿入して何を意味するのか理解していないコマンド上記の行ここでは、(挿入されていない)を実行する必要があります。 – mauro

    +0

    謝罪マウロ、私は私の質問をリフレーム。私は、コマンドを実行していたし、エラーを検出しました。私はそれが既存のスクリプトのどこかに追加する必要があり、おそらく考えていた。私はbashのに非常に新しいですそれゆえ私はごちゃ混ぜた可能性があります。 –

    1

    リコールを持っているなど、二重引用符で,が含まれているというように、perlを使用し、pythonできる場合は、変数内のすべての文字を変換しますパラメータ展開を持っています(例えば$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 
    
    関連する問題