2016-12-09 3 views
0

私は一番上の行の'|'の数を格納unixファイル全体の区切り文字の数を比較して一番上の行(フィールド)と一致させる方法は?

var=$(cat ip.txt | head -1 | sed 's/[^|]//g' | awk '{ print length }') 

としてVARを設定しています。

その後、私は

awk -F\| '{print NF-1}' ip.txt 

を使用して各行の区切り文字の数を取得することができますし、私は私が$varと得る個々の数字を比較する必要があります。

最終的な出力は、このような動作を示す行数です。 たとえば、2行目から20行目がヘッダーよりも区切り文字の方が多い場合、私の出力は19行に合計6000行(ファイル内の行数)の先頭行より区切り文字の数が多くなります。

例:

$ cat ip.txt 
DeptID|EmpFName|EmpLName|Salary 
Engg|Sam|Lewis|1000 
Engg|Smith|Davis|2000||| 
HR|Denis|Lillie|1500 
HR|Danny|Borrinson|3000| 
IT|David|Letterman|2000|| 
IT|John|Newman|3000 

ヘッダ有する3 '|' が、行3,5及び6は、余分な区切り文字を持っています。 私が出力

+0

実際の入力サンプルと予想される出力を指定します。 – Inian

+0

例を使って質問を編集しました – Dgstah

答えて

1
awk -F '|' ' 
NR == 1 { 
    # take the reference of field 
    RefCount = NF - 1 
    # skip header 
    next 
    } 
{ 
# count the number of line having NF - 1 separator in an array (1 count by number of separator) 
LinesWith[ (NF - 1)] ++ 
# uncomment line after if you want to print bad lines 
# if (NF - 1 != RefCount) print 
} 

# at the end (of file) 
END { 
    # print each element of the counting array (bad first, good finally) 
    for (LineWith in LinesWith) if (LineWith != RefCount) print "There is/are " LinesWith[ LineWith] " line(s) with " LineWith " separators" 
    print "There is/are " LinesWith[ RefCount] " correct line(s) with " RefCount " separators" 
    } 
    ' ip.txt 

コメント「3行は7行の合計から最上行以上の区切り文字を持っている」ようにしたい:

  • をこれはoneliner(「かもしれません")が必要ですが、スクリプトのために割り当てられた変数はありません。
  • コードは、自己
  • は私が(各特定のセパレータをカウント)ビットに要求を変更するが、いくつかの簡単な変更ではなく、細部の量を与えることができる(そう長くビットを思わ)理解使わ概念のためにコメントしている
2
$ awk -F'|' 'NR==1{n=NF} NF>n{c++} END{printf "%d lines > %d fields\n", c, NR}' ip.txt 
3 lines > 7 fields 
+2

これまでのように、シンプルで正確な^、私の答えはdownvotedでしたが、それも達成できました! – Inian

+0

これは役に立ちます。しかし、これを強化することはできますか?区切り文字の数がヘッダーよりも大きい行を削除する必要があります。上記の場合は、3行を削除する必要があります。 – Dgstah

+0

あなたがした答えではなく、受け入れなかった答えを強化することをなぜ求めるのですか?いずれにしても、この質問はすでに3ヶ月間閉鎖されていますが、新しい問題については継続的なサポートを期待するのではなく、より良い回答になることをお勧めします。 –

関連する問題