2017-10-15 7 views
1

./tool.sh -f <file> --edit <id> <column> <value>Awkの的に上書きファイルの列の値は、スクリプト引数

が実行されなければならないように、データベースなど

#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed 
933|Perera|Mahinda|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Lepland|Carmen|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
4194|Do|Hα»^Ó ChΓ­|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
8333|Wang|Chen|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
8698|Liu|Chen|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
8853|Monteno|Albin|male|1986-04-09|2010-03-19T21:52:36.860+0000|178.209.14.40|Internet Explorer 
10027|Chen|Ning|female|1982-12-08|2010-02-22T17:59:59.221+0000|1.2.9.86|Firefox 
1099511628908|Chen|Wei|female|1985-08-02|2010-05-24T20:52:26.582+0000|27.98.244.108|Firefox 
1099511633435|Smith|Jack|male|1981-04-19|2010-05-26T03:45:11.772+0000|50.72.193.218|Internet Explorer 
1099511635042|Kiss|Gyorgy|male|1984-09-14|2010-05-16T22:57:41.808+0000|91.137.244.86|Chrome 
1099511635218|Law-Yone|Eric|male|1987-01-20|2010-05-26T20:10:22.515+0000|203.81.95.235|Chrome 
1099511638444|Jasani|Chris|female|1981-05-22|2010-04-29T20:50:40.375+0000|196.223.11.62|Firefox 

に与えられ、その内の値、その特定のIDのIDカラムと値、変化を与えカラム

ex。

while [ $# -gt 0 ] 
    do 
      case $1 in 

      --edit) 
        id="$2"; 
        col="$3"; 
        val="$4"; 
      shift 3 
      ;; 
      -f) 
        dbfile=$2; 
      shift 
      esac 
      shift 
    done 

    egrep -o '^[^#]+' ${dbfile} | awk -F '|' -v OFS='|' -v id="${id}" -v col="${col}" -v val="${val}" '{if (($1="id") && ("col"<=8 && "col">=2)) {gsub($col,val)};{print}}' 

これまでのところ、ファイルには永続的な変更と唯一の変更はありません最初の行のすべての値ということがある:./tool.sh -f people.dat --edit 933 4 female

は私のコードがある 933|Mahinda|female|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox

ファイルを上書きする必要がありますなる "ID"

+1

ない明確で、あなたの最後の行に置き換えコードタグの出力はどのようなものでしょうか? – RavinderSingh13

+0

"これまでのところ、ファイルに永続的な変更はありません。"多くのUnixツールは、既存のファイルを上書きするオプションを提供していません。 '* nix'の安全なイディオムは' awk '{program}' inFile> outFile &&/bin/mv outFile inFile'です。がんばろう。 – shellter

+0

また、コードをここに投稿する前にhttp://shellcheck.net **を使用する方法を学んでください;-)。 shellcheckを使うときは、最初の行に適切な "she-bang"行を入れる必要があります。通常は '#!/ bin/bash'です。がんばろう。 – shellter

答えて

1

あなたは

if (($1="id") && ("col"<=8 && "col">=2)) { 

    ^    ^
     |     | 
     |     | 
     |   Since you got string col, which will always evaluate false 
     | 
     | 
    you are assigning field1 ($1) with string "id" which will be true always 
を得ました

あなたは変数で、いくつかの条件を適用する場合は、タイトル

スクリプト引数

1として与えられたファイルの列の値をoverwrittingのAwk)の代わりを持っているので、あなたが

if (($1==id) && ($col<=8 && $col>=2)) { 

    ^   ^
     |    | 
     |   AND column value corresponding to variable col is less 
     |   than or equal to 8 and greater than or equal to 2 
     |         ^
     |          | 
    if field1 is equal to variable id   | 
    ^         | 
     |          | 
     |          | 
     _____________ If both are true________| 
         | 
         | 

        gsub($col, $val) 

が必要gsub($col, $val)$col = $val

2)を使用することができ、egrep -o '^[^#]+' ${dbfile} |あなたはそれの世話をすると、以下のように簡略化することができ、あなたのawkで$1==id && $col<=8 && $col>=2を得たので:

awk -F '|' -v OFS='|' -v id="${id}" -v col="${col}" -v val="${val}" ' 
     $1==id && $col<=8 && $col>=2 { $col = val; print} 
     ' "${dbfile}" 
+0

# –

+0

で開始されたコメントを無視するために 'egrep-o '^ [^#] +''を使用しましたが、 'awk -F '|' -v OFS = '|' -v id = "$ {id}" -v col = "$ {col}" -v val = "$ {val}" ' $ 1 == id && $ col <=8 && $col> = 2 {$ col = val; print} '"$ {dbfile}" 'はファイルを上書きしませんでした。 –

+0

'gawk'を使っているなら' gawk -i inplace 'を使うことができます。そうでなければ一時ファイルに書き込んでから$ {dbfile}"> tmpfile && mv tmpfile "$ {dbfile}" ' –

0

あなたが説明してください可能性があり、この1

sed -i '/'"$id"'/s/\([^|]*\)/'"$val"'/'"$col" "$dbfile" 
+0

実際には '\([^ |] * \)'部分を取得してくれてありがとうございました。あなたは精巧に気にすることができますか? –

+0

私は試してみます:[^ |] *は、 '|'ではない各文字を意味するので、 '|'列を分離する。このパターンは7回一致します。私はsedに$ colカラムの内容を$ valの値で代用するように指示します。 info sed subtituteコマンド "s"とフラグgまたはnumberを参照してください。 –

+0

"/" "$ id" '/' '/ ^' "$ id" '|を/より安全な$ idに一致させるには、'/'を置換する必要があります。 –

関連する問題