2017-01-18 5 views
0

各行に4つのフィールドが必要なファイルがあります。フィールドの数が少ない場合、その情報を行番号のログファイルに書きたいと思います。awkを使用している列が少ない行を見つける

Filed1line1| Filed2line1| Filed3line1| Filed4line1 
Filed1line2| Filed2line2| 
Filed1line3| Filed2line3| Filed3line3| Filed4line3 

のような何か - 行番号2は、我々はawkを使用してこれを達成することができます

A.TXTファイルのための3つのフィールドを持っています。

実際に私は以下のコードスニペットを使用しています。フィールド数が<> 4ならば、私はそれを悪いファイルに書いています。それは良い働きをしています。しかし、私はログにNR値を書くことができません。

awk -F'|' -v DGFNM="$IN_DIR$DGFNAME" -v DBFNM="$IN_DIR$DBFNAME" ' 
    $1 == "DTL" { 
    if (NF == 4) { 
     print substr($0, 5) > DGFNM 
    } else { 
     print > DBFNM 
     print NR >> $logfile 
    } 
    } 
    ' "$IN_DIR$IN_FILE" 
+2

awk 'NF <4 {print NR}' 'は、4列未満の行の行番号を出力します。 –

+0

は、(他の2つに似た)ログファイル用の新しい変数を定義し、 '>'を使う必要もなく、デフォルトで '>'を追加します(他の2つに似ています)。 – karakfa

+0

'DGFNM'と' DBFNM'を正しく使用する構文を知っていますが、 'logfile'では正しくありませんでしたか? –

答えて

1

Easy:NFはレコードのフィールド数で、NRはレコード番号です。

何かのように:awk '{ if (NF < 4) { print "Row " NR " has " NF " fields"; } }' - そこに短い方法がありますが、私は別の出力ファイルへの印刷に関するいくつかの情報のため、この質問を参照してください;-)

を読みやすくである長いコードを好む:is it possible to print different lines to different output files using awk

へ編集した質問:$logfileは一重引用符で囲まれているので、シェル変数logfileに展開されません。そしてそれは "awk"変数ではありません。 awkでprint NR >> "some_file";を試してから、some_fileの名前を後で$ logfileに変更してください。

もう1つの方法は、インライン化するのではなく、拡張された$ logfileをawkファイルで生成することです。

+0

このオプションは私のために働いた - "あなたの編集した質問に答える:$ logfileは一重引用符の中にあるので、あなたのシェル変数のログファイルには展開されていません" awk "変数ではありません。 "; awkの中で、some_fileの名前を$ logfileに変更してください。 –

関連する問題