こんにちは、以下のようなURLのリストを含むファイルがあります。
file1:
http://www.google.com
http://www.bing.com
http://www.yahoo.com
http://www.baidu.com
http://www.yandex.com
....
http://www.yahoo.com の後にすべてのレコードを取得したい場合、結果は以下のようになります。
file2:
http://www.baidu.com
http://www.yandex.com
....
Yahoo.comが使用している場所の行番号を見つけるためにgrepを使用できることを知っています
$grep -n 'http://www.yahoo.com' file1
3 http://www.yahoo.com
しかし、行番号3の後にファイルを取得する方法がわかりません。また、grep -Aにはフラグがあり、一致した後に行を出力します。ただし、一致後に必要な行数を指定する必要があります。私はその問題を回避する何かがあるのだろうかと思っています。のような:
PSEUDO CODE:
$ grep -n 'http://www.yahoo.com' -A all file1 > file2
私が取得した行番号とwc -lを使用してyahoo.comの後の行数を取得できることはわかっていますが、かなり不自由だと感じています。
便利で簡単なソリューションを楽しみにしています。最初から問題を複雑にしていることを気軽に批判してください。awkコマンドとsedコマンドも歓迎します。
Awkを使用してもかまわない場合:
awk '/yahoo/{y=1;next}y' data.txt
このスクリプトには2つの部分があります。
/yahoo/ { y = 1; next }
y
最初の部分では、yahooの行に遭遇した場合、変数y = 1を設定し、その行をスキップします(next
コマンドは次の行にジャンプするため、スキップします現在の行でさらに処理する場合)。 next
コマンドなしでは、行yahooが出力されます。
2番目の部分は、以下の略記です。
y != 0 { print }
つまり、行ごとに、変数yがゼロ以外の場合、その行を出力します。 awkでは、変数を参照すると、その変数が作成され、コンテキストに応じてゼロまたは空の文字列になります。 yahooに遭遇する前に、変数yは0であるため、スクリプトは何も出力しません。遭遇後yahoo、yは1なので、その後のすべての行が出力されます。
または、sedを使用すると、yahooを含む行までのすべてが削除されます。
sed '1,/yahoo/d' data.txt
これは、sed
よりもgrep
の方がはるかに簡単です。 sed
は、その1文字のコマンドをすべての行を含む範囲に適用できます。これの一般的な構文は
START , STOP COMMAND
スペースを除く。 START
およびSTOP
はそれぞれ数値(1から始まる「行番号N」を意味する)にすることができます。ドル記号(「ファイルの終わり」を意味する)、またはスラッシュで囲まれた正規表現(「この正規表現に一致する最初の行」を意味する)。 (正確なルールはもう少し複雑です; GNU sed
マニュアルに詳細があります 。)
だから、あなたはあなたがそうしたいことをすることができます:
sed -n -e '/http:\/\/www\.yahoo\.com/,$p' file1 > file2
-n
は「特に指示がない限り何も出力しない」ことを意味し、-e
ディレクティブは「正規表現に一致する行の最初の出現から/http:\/\/www\.yahoo\.com/
の終わりまで」を意味します。ファイル、p
rint。」
これにより、出力にhttp://www.yahoo.com/
の行が含まれます。そのポイント以降のすべてのものが必要で、その行自体は必要ない場合、それを行う最も簡単な方法は、操作を反転することです
sed -e '1,/http:\/\/www\.yahoo\.com/d' file1 > file2
つまり、「1行目から正規表現に一致する最初の行まで/http:\/\/www\.yahoo\.com/
、d
elete the line」(そして、暗黙的に他のすべてを印刷します。-n
はnot今回は使用されました)。
awk '/yahoo/ ? c++ : c' file1
またはゴルフ
awk '/yahoo/?c++:c' file1
結果
http://www.baidu.com http://www.yandex.com
これはPerlで最も簡単に実行できます。
Perl -ne 'print unless 1 .. m(http://www\.yahoo\.com)' file
つまり、1行目からそのパターンが最初に現れるまでの間にare n’tであるすべての行を印刷します。
スクリプトを使用して
#get index of yahoo Word
index=`grep -n "yahoo" filepath | cut -d':' -f1`
#get total number of lines in file
totallines=`wc -l filepath | cut -d' ' -f1`
#subtract totallines with index
result=`expr $total - $index`
#gives the desired output
grep -A $result "yahoo" filepath