入力ファイルを3つの列に分割し、3番目の列に基づいて並べ替え[閉じる]

入力ファイルを3つの列に分割し、3番目の列に基づいて並べ替え[閉じる]

これまでのところ、私のスクリプト(script.sh)は次のようになりました。

#!/bin/bash/

BEGIN {  
        print "Author    Name of Book     ISBN"  
        print "------    ------------     ----"  
}  
{ printf "%-9s &s\n", 1$, 2$, 3$ }  
END  

次に、次のコマンドを実行します。

sort -k 3,3 INPUTFILE.INPUT | awk -f script.sh  

上記のどれも好きなようには機能しません。

また、入力ファイルのデータはカンマで区切られます。また、awkコマンドが実行したい「ループ」を使用する必要があります。

ベストアンサー1

以下はいくつかの問題、いくつかはエラーが発生し、他のものは誤字または誤解の結果です。

  1. - 行を#!削除できます。それとも削除する必要がありますか?

    #!/usr/bin/awk -f
    

    awk(またはシステムのどこでも)。上記の-lineを使用すると、コマンドラインからスクリプトを呼び出す#!必要はありませんが、直接使用できます(実行可能な場合)。 -lineがない場合は、コマンドラインで使用する必要があります。awk -f./script.awk#!awk -f

  2. 入力データの特定のフィールドの値を参照するには、参照するフィールド番号の代わりに$nwhereを使用してください。nn$

  3. フォーマットprintf文字列にはフォーマットプレースホルダーが1つしかありませんが、3つのデータを提供します。また、パラメータの周りに括弧はありません。

  4. ブロックENDを削除できます。

  5. 入力にスペース(スペースまたはタブ)で区切られていない、,または同じフィールド区切り文字がある場合、またはなどを使用するか、ブロック内の適切な文字に変数を設定してそれを表示する必要があります。それ以外の場合、スクリプトは入力レコードを誤って分割します。|awkawk -F ','awk -F '|'FSBEGIN

これでスクリプト()が残りますscript.awk

BEGIN {
    fmt = "%-15s\t%-15s\t%-15s\n"
    printf(fmt, "Author", "Name of Book", "ISBN")  
    printf(fmt, "------", "------------", "----")  
}

{ printf(fmt, $1, $2, $3) }

私は3つのタブで区切られたフィールドのそれぞれを左揃えの文字列にフォーマットするフォーマット文字列を自由に導入しました。各フィールドには15文字のスペースがあります。ブロックを変更して簡単にfmt調整できますBEGIN

通貨は次のとおりです。

sort -t ',' -k 3,3 INPUTFILE.INPUT | awk -F ',' -f script.awk

ここでは、ファイルのデータがコンマで区切られていると仮定します(sortそれに応じてコマンドが変更されました)。

おすすめ記事