簡體   English   中英

GREP從另一個文件中的文件行,直到出現某個字符

[英]GREP lines from file in another file until occurence of a certain character

grep -A 10 -f smallfile bigfile

greps來自bigfile中的smallfile和接下來的10行的每一行

是否有可能通過使用另一個標志而不是-A來保持grepping以下行,直到bigfile中出現一個字符(比如說@),我需要從smallfile中為數百行進行,我沒有信息如何從smallfile到我需要grep的行之后的許多行,它會為每個行更改。 示例只是說明其中一行:

小文件:

@123
@555

大文件:

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

所以我希望它能給我這個

@123
abc
def
ghj
@555
yui
wer

如果你知道從另一個文件中的一個文件“grepping”行的另一種方法可以做到這一點,那也行,我可能會嘗試編寫python腳本或更復雜的循環,但我相信應該有一種方法可以grep使用像-m這樣的標志來做這件事,但我無法讓它按照我想要的方式工作。

非常感謝!

使用awk比使用grep更好地處理這項工作。 在我的測試中,Bellow腳本似乎正常工作:

$ 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初始化一個數組作為鍵/索引
$0 in a = $ 0檢查$ 0(整行)是否為數組a的鍵/索引
$0 !~/^@/ = $ 0與正則表達式匹配/ ^ @ / =不以@開頭
next =讀下一行
文件由awk串行讀取條件可以省略,動作可以直接寫入。 在這種情況下,當awk到達時總是執行動作(相當於condition == 1 / true)
對於給定條件,可以省略動作。 在這種情況下,將執行默認操作= print $ 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM