2016-03-29 4 views
0

私は、ユーザーが行のファイル、列、値、およびIDを与える問題があります。私は、行の値を変更しようとしています分割されたファイルbashシェルの特定の列にあるファイルを編集する

ファイルの形式は次のとおりです。

F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8に

私の考えをそれを行うのはファイルを読み込み、各フィールドの値を配列に入れることです。それから私は、私があれば使用して変更したい行を見つけると私はしかしawk

while IFS=$'|t' read -r -a myArray 
do 
if [ $4 == ${myArray[0]} ]; then 
    echo "${myArray[1]} ${myArray[2]} ${myArray[4]}" 
    awk -v column="$5" -v value="$6"-F '{ ${myArray[column]} = value }' 
    echo "${myArray[1]} ${myArray[2]} ${myArray[4]}" 
    echo "${column} ${value}" 
fi 
done < $2 

、私は何も変化しないことをやるときに使用します:列と値の引数は何も印刷されません。
アイデア

+1

シェルでループを書くたびにあなたが間違ったアプローチをしているテキストを操作する。もっと多くの背景についてはhttp://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practiceを読んで本を読んでくださいEffective Awk Programming、4th Arnold Robbins著、Edition、それを正しく行う方法を学ぶ。 –

答えて

0

あなたはあまりにも多くの情報を提供しませんでした。

  1. $2=="F2"はフィールド2があなたの特定の文字列にマッチされてチェックしている:あなたはF2あなたが以下のように行うことができますされFIELD2特定の列を変更するとします。

  2. $2="Hello"は "こんにちは"

awk -F"|" 'BEGIN{OFS="|"} ($2=="F2"){$2="Hello";$1=$1; print}' sample.csv

は私の例を参照してください全体のレコード(行)

  • printプリントアウト全体のレコードを再割り当てする2
  • $1=$1をフィールドに代入されます
    $cat sample.csv                      
    F1|F2|F3|F4|F5|F6|F7|F8 
    
    $awk -F"|" 'BEGIN{OFS="|"} ($2=="F2"){$2="Hello";$1=$1; print}' sample.csv       
    F1|Hello|F3|F4|F5|F6|F7|F8 
    
  • +1

    ここ$ 1 = $ 1は冗長です。あなたはすでに2ドルを割り当てています。 – karakfa