シェルスクリプト:テキストの途中で文字列を取得します。


9

大きなテキストファイルがあり、その一部が次のようになっています(編集された値)。

JULIANA XXXX006060 LI1033322 THC BRL 730.00
XXXX006296 AA1004737 THC BRL 1,740.00
SANTOS JULIANA XXXX006668 AA1004786 THC BRL 8,150.00
SANTOS JULIANA CABINDA XXXX006697 AA1004777 THC BRL 2,325.00
SANTOS JULIANA XXXX006699 AA1004790 THC BRL 2,325.00
JULIANA BATA XXXX006141 CCC012946 THC BRL 1,460.00
JULIANA BATA XXXX006153 CCC013054 THC BRL 870.00
JULIANA XXXX006269 CCC013105 THC BRL 870.00
JULIANA XXXX006295 CCC013083 THC BRL 870.00
JULIANA BATA XXXX006305 CCC013043 THC BRL 1,460.00

私は常にグラブ(としたいcutか、awkまたは何か他のもの)で始まる文字列XXXX00が、それは同じフィールド番号で決してません。

シェルスクリプトでどうすればいいですか?

回答:


12

ちょうどgrepそれのために:

grep -oE 'XXXX00[0-9]*' file
  • -o:一致する部分のみを印刷します。
  • -E:拡張正規表現をアクティブにします。
  • [0-9]*:検索する文字列の後には、数字のみが表示されます。

正規表現には-Eオプションは必要ありません(ただし害はありません)。
Jonathan Leffler、2015年


3

grepPCREでの使用:

% grep -Po '(^|\s)\KXXXX00[^\s]*(?=(\s|$))' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

-wこの場合、(単語)を使用して回避できます。単語構成文字は次のように見なされ[[:alnum:]_]ます。

% grep -wo 'XXXX00[^ ]*' file.txt
XXXX006060
XXXX006296
XXXX006668
XXXX006697
XXXX006699
XXXX006141
XXXX006153
XXXX006269
XXXX006295
XXXX006305

2

他のいくつかの方法

GNUで awk

awk -vRS='[[:space:]]+' '/^X{4}0{2}/' file

古いバージョンのGNU awkでは--re-interval必要になる可能性があるため、

awk --re-interval -vRS='[[:space:]]+' '/^X{4}0{2}/' file

trgrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'

1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

そこには人のリストがあり、名前の数が異なるため、フィールド数が異なるように見えます。ただし、名前に0が含まれているものはおそらくないので、スペースで区切られた最初の文字列まで1つだけ完全に切り取り、それを保存して、以降のすべてを切り取ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.