Script Shell: ambil string di tengah teks, terkadang di awal

9

Saya memiliki file teks besar yang sebagiannya terlihat seperti ini (nilai yang diedit):

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

Saya ingin selalu mengambil (dengan cutatau awkatau sesuatu yang lain) string yang dimulai dengan XXXX00, tetapi tidak pernah dalam nomor bidang yang sama.

Bagaimana saya bisa melakukannya di shell-script?

Vitor Gatti
sumber

Jawaban:

12

Hanya grepuntuk itu:

grep -oE 'XXXX00[0-9]*' file
  • -o: Mencetak hanya bagian yang cocok.
  • -E: Mengaktifkan ekspresi reguler yang diperluas.
  • [0-9]*: Setelah string untuk mencari, hanya angka yang akan muncul.
kekacauan
sumber
Perhatikan bahwa regex tidak membutuhkan -Eopsi (meskipun tidak ada salahnya).
Jonathan Leffler
6

Tampaknya Anda ingin bidang ke-5 dari kanan, maka

awk '{print $(NF-4)}' file
glenn jackman
sumber
ya!
mikeserv
3

Menggunakan grepdengan PCRE:

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

Anda dapat lolos dengan -w(kata) dalam hal ini, perhatikan bahwa kata karakter penyusun dianggap sebagai [[:alnum:]_]:

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

Beberapa cara lain

Dengan GNU awk

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

Dengan versi GNU yang lebih lama awk, --re-intervalbisa diperlukan, jadi

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

Dengan trdangrep

<file tr -s '[:space:]' '[\n*]' | grep '^X\{4\}0\{2\}'
iruvar
sumber
1
sed 's/[^0]*  *\([^ ]*\).*/\1/' <in >out

sepertinya jumlah bidang berbeda karena Anda memiliki daftar orang di sana, dan mereka memiliki jumlah nama yang berbeda. tetapi mungkin tidak ada dari mereka yang memiliki nama dengan 0 di dalamnya, jadi cukup potong sepenuhnya hingga string pertama yang dibatasi spasi dengan satu di dalamnya, simpan, dan potong semua yang mengikuti.

mikeserv
sumber