2013-02-17 2 views
1

У меня есть данные, что в форме, как этогоUnix вернулся телефонный номер, нужно форматировать

 
JSD4863 XXX-XX-XXXX DOE, JOHN C JR-II BISS CPSC BS INFO TECH 412/779-9445 

Сво большой список, так что я сделал петлю, чтобы читать в определенных линиях. Похоже, что это

#!/bin/bash 
for linePosition in {11..22} 
do 
    holder=`sed -n "${linePosition}p" $1|awk '{print $12}'` 
    echo "$holder" 
done 

Он печатает номер 412/779-9445. Работает для всех строк Тем не менее, меня интересуют только последние 4 числа (например, 9445) Что я могу добавить в свой цикл, чтобы он ограничивал это? Я пробовал cut, может быть, мой синтаксис был просто неправильным.

ответ

0

sed -rn 's/.*-([0-9]{4})$/\1/p'

+0

это дало пустые строки, а также. – onTheInternet

+0

Я положил кучу строк в файл stuff.txt и запустил следующее: '' 'cat stuff.txt | sed -rn 's /.*- (. *) $/\ 1/p' | xargs echo''' –

+0

Вы также можете добавить свой код целиком (читает только строки между 11 и 22): '' 'cat stuff.txt | sed -rn '11, 22s /.*- (. *) $/\ 1/p '| xargs echo''' –

0

Посмотрите на следующее. С первой командой я показываю вам, как выглядит рабочий сценарий. Со второй командой я показываю вам вывод из сценария примера.

$ cat a.sh 
#!/bin/sh 
sed -n '11,22p' $1 | grep -o '[0-9]*$' 

$ ./a.sh a.txt 
9445 
9445 
9445 
9445 
9445 
9445 
9445 
9445 
9445 
9445 
9445 
9445 
0

Awk только:

awk 'FNR>=11 && FNR<=22 {print $12}' file 

Сед + AWK:

sed -n '11,22p' | awk '{print $12}'