2017-02-02 20 views
-1

私は1000行のdatファイルを持っていますが、各行からいくつかの文字を切り捨てる必要があります:-c900-903。この抽出された文字の長さが空白でない場合、行全体を新しいdatファイルに出力する必要があります。どのように私はUNIXスクリプトでそれを行うことができますか?UNIXのdatファイルの読み込みスクリプト

私はあなたがスペースを必要とするIFS=した後、この

while IFS=read -r line; do 
characters= cut -c900-903 
if [ -n $characters ] 
then 
echo "$line" 
fi 
done < $inputfile > $output file. 
+3

文字がすべて空白文字の場合は削除する必要がありますか?行全体を他のファイルに出力するか、抽出した文字だけを出力しますか?詳細を説明し、入力/希望出力の例を示すために[編集]してください。 –

+0

最小の長さの行をすべて別のファイルに移動したいと言っていますか?長さが10未満のすべての行も削除したい場合、なぜ移動するのですか? –

+0

抽出された文字の長さが空白でない場合には、行全体を移動する必要があります。IFS = read -r行中に以下のコードを試しました。 文字を行う= -c900-903 場合を切る[-n $文字] その後、 エコー "$ライン" Fiの 済<$入力ファイル> $出力ファイル。しかし、上記のコードは動作していません、それは新しいファイルに抽出された文字を書いています.. –

答えて

0

を試してみました。
変数charactersに値を割り当てるときは、スペースを使わないでください。
characters="cut -c900-903"では、サブコマンドの結果ではなく文字にテキストを割り当てます。これには$(command)を使用してください。
cutコマンドは、切り取る入力が必要です。echo "${line}"を使用してください。
スペースは空ではありません。-n $characters(空白を見れば-n "$characters"はエラーを避けることができます)は空白を見てうれしくなります。

while IFS= read -r line; do 
    characters=$(echo "${line}"| cut -c900-903) 
    if [ "${characters}" != " " ] 
    then 
     echo "${line}" 
    fi 
done < $inputfile > $output_file 

大きなファイルの場合、これは各ループにロードする必要のあるサブコマンドのために非常に遅くなります。 awkgrep、またはsedなどの他のツールを試すことができます。 以下はあなたのために働いていますか:

grep -vE "^.{899} {4}" ${inputfile} 
+0

ありがとう... @Walter。変更されたコードは私のために働いた。しかし、50000レコードで約10分かかっています。私は約2 Lakhs(0.2百万)のレコードを持つdatファイルを持っています。サイズは700 MBです。私はこのスクリプトをAutosysジョブで実行する必要があります。これは、成功すると別の仕事を引き起こします。同じシナリオを実行してファイルを読み込んで、上のような出力を得るためのより高速なアプローチはありますか?私はAwkを試しましたが、レコードが大きすぎると言うエラーが出ました...(各レコードは約5000文字です)... –

+0

'grep -vE'を試しましたか?コマンドラインから、ループなしで出力をファイルにリダイレクトするだけですか?あるいは 'head -10 $ {inputfile} |でテストしてください。 grep .. ' –

+0

最新のawkバージョン(nawk以上のgawk)では、レコードの制限がありません。 –

関連する問題