1

3 つの異なるテキスト ファイルに保存されている次の情報を読み込んだとします (さらに多くの場合があります)。

ファイル 1

1 2 rt 45
2 3 er 44

ファイル 2

rf r 4 5
3 er 4 t
er t yu 4

ファイル 3

er tyu 3er 3r
der 4r 5e
edr rty tyu 4r
edr 5t yt5 45

この情報を読み取るときに、これらの2つのファイルからこの情報を別々の配列に出力したいのですが、今のところそれらは同時に出力されます

これで、このスクリプトですべての情報を同時に出力できます

{
    TESTd[NR-1] = $2; g++
}   
END {           
   for (i = 0 ; i <= g-1; i ++ ) {
        print "            [\"" TESTd[i] "\"]"

     }
     print "            _____"
}

しかし、複数のファイルを読み込んで、すべてのテキスト ファイルに対してこれを行う方法はありますか? awk -f test.awk 1.txt 2.txt 3.txtを実行するときにこの出力を取得する代わりに

    ["2"]
    ["3"]
    ["r"]
    ["er"]
    ["t"]
    ["tyu"]
    ["4r"]
    ["rty"]
    ["5t"]
    _____

私はこの出力を得る

    ["2"]
    ["3"]
    _____
    ["r"]
    ["er"]
    ["t"]
    _____
    ["tyu"]
    ["4r"]
    ["rty"]
    ["5t"]
    _____

また、30 ほどのテキスト ファイルがあるため、一度に各ファイルを読み込むことはできません。

編集_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _

このようなことをするつもりなので、可能であればawkでこれをやりたいです

{
    PRINTONCE[NR-1] = $2; g++
    PRINTONEATTIME[NR-1] = $3
}
END { 
            #Do this for all arguments once
        for (i = 0 ; i <= g-1; i ++ ) {
             print "            [\"" PRINTONCE[i] "\"] \n"
        }
        print "            _____"
            #Do this for loop for every .txt file that is read in as an argument
              #for(j=0;j<args.length;j++){
        for (i = 0 ; i <= g-1; i ++ ) {
             print "            [\"" PRINTONEATTIME[i] "\"] \n"
        }
        print "            _____"
}
4

4 に答える 4

1

私が理解していることから、動作する awk スクリプトがあり、その awk スクリプトを多くのファイルで実行し、それらの出力の間に改行 (または_ ) を入れて、どの出力がどのファイルからのものであるかを区別できるようにしたいと考えています。

このbashスクリプトを試してください:-

dir=~/*.txt #all txt files in ~(home) directory
for f in $dir
do
    echo "File is $f"
    awk 'BEGIN{print "Hello"}' $f #your awk code will take $f file as input.
    echo "------------------"; echo;
done

また、すべてのファイルに対してこれを行いたくない場合は、 for ループを として記述できますfor f in 1.txt 2.txt 3.txt

于 2011-06-30T12:10:00.970 に答える
0

awk で直接実行したくない場合。たとえば、bash または zsh で次のように呼び出すことができます。

for fic in test*.txt; awk -f test.awk $fic
于 2011-06-30T11:01:40.470 に答える
0

awk で直接行うのは非常に簡単です。

# define a function to print out the array
function dump(array, n) {
    for (i = 0 ; i <= n-1; i ++ ) {
        print "            [\"" array[i] "\"]"
    }
    print "            _____"
}

# dump and reset when starting a new file
FNR==1 && NR!=1 {
    dump(TESTd, g)
    delete TESTd
    g = 0
}
# add data to the array
{
    TESTd[FNR-1] = $2; g++
}
# dump at the end
END {
    dump(TESTd, g)
}

注意: 使用delete TESTdは非標準の gawk 機能ですが、質問は gawk としてタグ付けされているので、使用しても問題ないと思いました。

ARGINDまたは、 、ARGVARGCまたはの 1 つ以上を使用FILENAMEして、異なるファイルを区別することもできます。

または、 https://stackoverflow.com/a/10691259/981959を参照して提案されているように、gawk 4 では、元のENDFILEグループの代わりにグループを使用できます。END

{
    TESTd[FNR-1] = $2; g++
}
ENDFILE {
    for (i = 0 ; i <= g-1; i ++ ) {
        print "            [\"" TESTd[i] "\"]"
    }
    print "            _____"
    delete TESTd
    g = 0
}
于 2012-06-26T23:51:34.000 に答える
-1

bash シェル スクリプトまたは基本的なシェル スクリプトを記述します。以下をtest.shに入れてみてください。次に、/bin/sh test.sh または /bin/bash test.sh を呼び出して、どちらが機能するかを確認します。

for f in *.txt
do
  echo "File is $f"
  awk -F '\t' 'blah blah' $f >> output.txt
done

または、awk スクリプトを呼び出す bash シェル スクリプトを記述します。

for f in *.txt
do
  echo "File is $f"
  /bin/sh yourscript.sh
done
于 2012-07-08T22:16:31.627 に答える