シェルスクリプトからAWKスクリプトに2つの変数を渡したいと思います。
#!/bin/bash
HeaderSize=$(grep -n "# end header data" input.list | tr ":" "\n" | head -n 1)
RecordSize=$(grep -n "# Number of unique" input.list | tr ":" "\n" | tail -n 1 | sed 's/,//g')
echo $HeaderSize
echo $RecordSize
head -n $HeaderSize input.list > temp.list
./parse.awk -v headersize=$HeaderSize -v recordsize=$RecordSize < input.list >> temp.list
文書解析.awk次のようになります。
#!/bin/gawk -f
BEGIN {
curline=1;
excludeline=0;
newrecordsize=0;
}
{
if (curline < $headersize) {
curline++;
} else {
if (($2 !~ /test1/) && ($2 !~ /test2/) && ($2 !~ /test3/)) {
print $0;
} else {
excludeline++;
}
}
}
END {
print "#", excludeline, "lines excluded";
newrecordsize = recordsize - excludeline;
printf "# Number of unique items after exclusions: %'d\n", newrecordsize;
}
そのため、ヘッダーを直接コピーしてから、一部のデータを除外したいと思います。
Bashファイルを実行すると、gawkの実行時にエラーが発生します。
38
94108
gawk: ./parse.awk:6: fatal: cannot open file `94108' for reading (No such file or directory)
94108 は、RecordSize の値であるか、渡したい 2 番目の変数です。
このエラーをどのように解決できますか?
編集する:以下の答えは変数の二重引用符に関連しており、これは明らかにどこでも行う必要があります。これは私の現在のスクリプトであり、うまく動作します。
#!/bin/bash
HeaderSize=$(grep -n "# end header data" input.list | tr ":" "\n" | head -n 1)
RecordSize=$(grep -n "# Number of unique" input.list | tr ":" "\n" | tail -n 1 | sed 's/,//g')
echo "$HeaderSize"
echo "$RecordSize"
head -n "$HeaderSize" input.list > temp.list
./parse.awk -v "headersize=$HeaderSize" -v "recordsize=$RecordSize" < input.list >> temp.list
私もawkスクリプトをクリーンアップしました。
#!/bin/gawk -f
BEGIN {
excludeline=0;
newrecordsize=0;
}
NR > headersize {
if (($2 !~ /test1/) && ($2 !~ /test2/) && ($2 !~ /test3/)) {
print $0;
} else {
excludeline++;
}
}
END {
print "#", excludeline, "lines excluded";
newrecordsize = recordsize - excludeline;
printf "# Number of unique domains after exclusions: %'d\n", newrecordsize;
}
答え1
$RecordSize
変数を参照する。先頭にスペースがあるようです。
echo "$HeaderSize"
echo "$RecordSize"
./parse.awk -v "headersize=$HeaderSize" -v "recordsize=$RecordSize" < input.list >> temp.list