0

関数「testfunc」にファイル名であるパラメータ $8 を渡したい。この関数は、そのファイルの key_word を grep し、年を返す必要があります。問題は、Linux コマンド「grep」が fileN に何も表示されないことです。$8 を直接渡しても、何も表示されません。

awk '
   function testfunc(fileN, my_year)
     { "grep 'key_word' fileN"  | getline my_year
       return(my_year)
       close("grep 'key_word' fileN")
     }
   BEGIN {OFS="\t"}
         {printf "%s\t%s\t%s\t", $8, testfunc($8), $9}'
4

3 に答える 3

1

これを試して:

function testfunc(fileN)
     { 
       cmd="grep 'key_word' " fileN 
       cmd | getline my_year
       return(sprintf("%s",my_year))
     }
于 2013-03-05T20:20:39.723 に答える
1

これはあなたが探している構文です:

awk '
   function testfunc(fileN,       my_year, cmd)
     { cmd = "grep \"key_word\" " fileN
       cmd | getline my_year
       close(cmd)
       return(my_year)
     }
   BEGIN {OFS="\t"}
         {printf "%s\t%s\t%s\t", $8, testfunc($8), $9}'

しかし、コメントで述べたように、これを行わないでください。これは、何をしようとしても間違ったアプローチです。

一重引用符で区切られたスクリプト内では一重引用符を使用できないことに注意してください。

編集:別のアプローチを使用することについての私のポイントを明確にしてみましょう。ファイルがあるようです。それを「file1」と呼びましょう。これは、8 番目のフィールドに別のファイル名があり、9 番目のフィールドに他の値があります。その8番目のフィールドで指定されたすべてのファイルには、それぞれテキスト「key_word」を含む行が含まれており、印刷したいのは、file1の8番目のフィールド、次にタブ、名前付きファイルのキーワード行、9番目のフィールドです。ファイル1から。

それは次のように書くことができます (考えられる解決策の 1 つにすぎません)。

gawk -v OFS='\t' '
ARGIND < ARGC { if (/key_word/) my_year[FILENAME] = $0; nextfile }
{ print $8, my_year[$8], $9 }
' $(awk '{print $8}' file1 | sort -u) file1

つまり、「file1」で awk を 1 回呼び出して、必要な日付情報を含むファイルのリストを取得し、そのファイルのリストを「file1」の前にもう一度 awk に渡すと、最終的に file1 を処理するときに必要なすべての情報がファイルに保存されます。配列。

上記では、効率のために GNU awk の「nextfile」を使用していますが、これは必須ではなく、明確にするために GNU awk ARGIND を使用していますが、非 gawk ソリューションでは ARGIND < ARGC を FILENAME!=ARGV[ARGC] に置き換えることができます。

多くの代替ソリューションがありますが、それはすべて、実際に何をしようとしているかによって異なります....

于 2013-03-06T00:10:56.700 に答える
0

Ed と Zsolt の協力に感謝します。最後に、代わりにシェルスクリプトを使用することにしました。grepコマンドに加えて、必要sedな特殊文字のためにあらゆる種類の問題を引き起こすコマンドが必要だったからです。したがって、私の最終的な解決策は次のとおりです。

fileList=`ls -1 *.xml`
for f in ${fileList} ; do
   my_year=`grep -e "key_word"  ${f} | sed -n '{s/^.*>\([0-9][0-9]*\)<.*$/\1/p}'`
   line=`ls -ltr ${f}`
   line="${line} ${my-year} sthElseHere"
   echo ${line}
done | \

awk ' BEGIN {print "File Name              \tcol02 \tcol03 "
             print "===================    \t====== \t============"}
            {printf "%s\t%s\t%s\n", $8, $4, $9  }'
于 2013-03-06T16:06:19.827 に答える