2017-03-28 9 views
1

私の入力ファイルの構造上のアクションを実行するには、次のとおりです。バッシュ - 次のようにファイルの内容をループして、行と列

<string1> <string2> <stringN> 
hello nice world 
one  three 

は注:、第二列がnullに/タブがあります2番目の列。従って、2行目の2番目の列は空であり、

バッシュではない「3」は、私は、個々の列を処理することができ、各列をループしたいと(文字列[1-N])

私は、各行に反復することができる午前:

#!/bin/bash 

while IFS='' read -r line || [[ -n "$line" ]]; do 
     line=${line/$/'\t'/,} 
     read -r -a columns <<< "$line" 
     echo "current Row: $line" 
     echo "column[1]: '${columns[1]}'" 
     #echo "column[N] '${columns[N]}'"  
done < "${1}" 

期待される結果

current Row: hello,nice,world 
column[1]: 'nice' 
current Row: one,,three 
column[1]: '' 

基本的には、入力ファイル(ここでは引数として渡します)を反復処理し、空白がトリムされないようにすべての「クリーニング」を行い、バックスラッシュを無視して最後の行を無視します。 次に、 '\ t'タブをカンマで置き換えて とし、最後に列を配列(列)に読み込んで特定の列を選択できるようにします。

入力ファイルにセパレータ値のタブがあるので、私はcsv形式に変換しようとしましたが、私が使用する正規表現がbashで正しいかどうか、これが値を返さないので間違っています配列。あなたは、ほとんどそこコンマに「\ tを」翻訳の上の少しの修正であり、あなたはコンマこともIFSを設定する必要が

おかげ

答えて

1

これを試してみてください。

#!/bin/bash 
while IFS='' read -r line || [[ -n "$line" ]]; do 
     line=${line//$'\t'/,} 
     IFS=',' read -r -a columns <<< "$line" 
     #echo "current Row: $line" 
     echo "column[0]:'${columns[0]}' column[1]:'${columns[1]}' column[2]:'${columns[2]}'" 

done < "${1}" 

実行:

$> <the_script> <the_file> 

出力

column[0]:'hello' column[1]:'nice' column[2]:'world ' 
column[0]:'one' column[1]:'' column[2]:'three' 
関連する問題