2017-03-14 4 views
2
grep -A 10 -f smallfile bigfile 

grepする小型ファイルからすべての行を過ぎGREPライン大型ファイルと次の10行で

それはgrepを維持するために-Aの代わりに別のフラグを使用することにより可能です大文字の中に文字が現れるまでの行数(@と言うことができます)と、私はsmallfileから数百行の行を処理する必要があります。また、grepに必要なsmallfileの行の後ろに何行もありません。それぞれについて。あなたが別の方法を知っている場合ので、私はそれがこのに私に

@123 
abc 
def 
ghj 
@555 
yui 
wer 

を与えたい

@123 
abc 
def 
ghj 
@789 
sdf 
tyu 
rzx 
@555 
yui 
wer 
@435 
teg 
gdgd 

小型ファイル:

@123 
@555 

大型ファイルだけの行のいずれかを示す例これを行うことができる別のファイルの1つのファイルから "grepping"行を削除すると、それも機能します。私はPythonスクリプトやもっと複雑なループが必要ですが、grepに-mのようなフラグを使用させる方法があるはずですが、私が望むように動作させることはできませんでした。

多くのありがとうございます!

+0

なぜawk'と 'perl'のようなより高度なツールに切り替えませんか? – osgx

+1

'csplit bigfile/^ \ @ /' – jm666

+1

@DragonRider、標準gnu grepにこのようなオプションはないようです:http://git.savannah.gnu.org/cgit/grep.git/tree/src/grep .c#n1301 'prtext .. pending = out_quiet? 0:MAX(0、out_after); .. prpending'とlimはバッファの終わりを指すポインタです。単一パターンのAWKソリューション:http://stackoverflow.com/questions/29180929/ perl multiline regexp in grep&sed。 – osgx

答えて

2

この仕事は、grekよりもawkでうまく処理されます。 ベロースクリプトは、私のテストで正常に動作するようです:

$ awk 'NR==FNR{a[$0];next}$0 in a{print;f=0;next} \ 
{if ($0 !~ /^@/ && f!=1) {print} else {f=1}}' smallfile bigfile 

あるいは:

awk 'NR==FNR{a[$0];next}$0 in a || ($0 !~ /^@/ && f!=1){print;f=0;next}{f=1}' file1 file2 

は説明:
awkのスクリプトが'condition1{action1}condition2{action2}etc'
FNR =オープンファイルの行数が(上のリセットパターンに基づいています
NR =グローバル行番号 - すべてのファイルの間で増加し続けます
|| = OR論理演算子
$0 =全ライン
a[$0] =キー/インデックス
$0 in a = $ 0(全行)が
$0 !~/^@/ = $ 0は実行アレイのキー/インデックスがあるかどうかを確認として$ 0の配列を初期化正規表現とマッチしない/^@/=で始まらない@
next =次の行を読む
ファイルはawkによってシリアルに読み込まれる 条件を省略してアクションを直接書くことができます。この場合、アクションは常にawkによって到達されます(条件== 1 /真と等価)
与えられた条件に対しては、アクションは省略できます。その場合、デフォルトのアクションが実行されます= print $ 0

+1

こんにちは、ありがとう。私は以前に小さなファイルから何百行もそれを行う必要があると書きましたが、今私の例をより明確にしました – DragonRider

+1

@DragonRiderこれを試してみてください... –

+1

George、https:// codegolfのようなものですか? stackexchange.comプログラミング言語? – osgx

関連する問題