テキストに単語が表示される回数と同様に、テキストファイル内のその単語のすべてのインスタンスに対して単語が表示される場所を探したいのですが、どこから始めるべきかさえわかりません。ループとgrepとwcの組み合わせが必要だと思います。
たとえば、以下はiPhone 11に関する記事です。
火曜日、同社は同社の普及型iPhone 11携帯電話が昨年の類似モデルの750ドルに比べて700ドルから始まると明らかにしました。年度。
Appleは、高度なモデルであるiPhone 11 ProとiPhone 11 Pro Maxの開始価格をそれぞれ1,000ドルと1,100ドルに保ちました。同社はシリコンバレーキャンパスで90分間の記者会見を通じて新しい携帯電話を発売しました。
本文は合計81語です。
jaireaux@macbook:~$ wc -w temp.txt
81 temp.txt
「iPhone」という単語が3回表示されます。
jaireaux@macbook:~$ grep -o -i iphone temp.txt | wc -w
3
私が望む出力は次のとおりです。
jaireaux@macbook:~$ whereword iPhone temp.txt
24
54
57
この出力を取得するにはどうすればよいですか?
答え1
GNUツールを使用する1つの方法は次のとおりです。
$ tr ' ' '\n' < file | tr -d '[:punct:]' | grep . | grep -nFx iPhone
25:iPhone
54:iPhone
58:iPhone
1つ目はtr
すべてのスペースを改行文字に置き換え、2つ目はすべての句読点を削除します(それでiPhone,
単語として見つけることができます)。grep .
空の行をスキップし(これらの行は計算しません)、grep -n
出力に行番号を追加します。その後、入力を正規表現として扱うのではなく、行全体にわたる一致のみを見つける必要があることを指示します-F
(それは一致とは見なされません)。質問に記載した数字に1桁が欠落しています。grep
-x
job
jobs
数字だけが必要な場合は、別の手順を追加できます。
$ tr ' ' '\n' < file | tr -d '[:punct:]' | grep . | grep -nFx iPhone | cut -d: -f1
25
54
58
コメントで指摘したように、ここにはまだaren't
orなどの「単語」の問題がありますdouble-barreled
。以下を使用して改善できます。
tr '[[:space:][:punct:]]' '\n' < file | grep . | grep -nFx iPhone
答え2
trコマンドを使用して、すべてのスペースを単一の改行文字に置き換えます(圧着オプションを使用)。
これをnl -baにパイプすると、各行(および単語)に順番に番号が付けられます。
必要な単語を取得するには、grep -Fにパイプします。これにより、その単語の数とテキストのみが表示されます。
awkもプロセスでこれを行いますが、より複雑に見えます。
答え3
別のオプションは次のとおりですsed
。
sed -e '/^$/d' -e 's/^[[:blank:]]*//g' < file | sed 's/[[:blank:]]/\n/g' | grep -ion "iphone"
出力:
25:iPhone
54:iPhone
58:iPhone
答え4
関数を作成します。
$ whereword(){ grep -ion "$1" -<<<$(egrep -o "[^[:blank:]]+" "$2"); }
$ whereword iPhone tmp.txt
25:iPhone
54:iPhone
58:iPhone
$ whereword "aren't" tmp.txt
14:aren't