awk / sed regex, извлеките столбец с разделителем - PullRequest
0 голосов
/ 24 октября 2011

У меня есть файл с таким форматом: два столбца чисел в начале и два столбца числа в конце и один столбец в середине, который является именем, но имя имеет разделитель пространства, который запутывает вещи.

Существует ли какое-либо регулярное выражение, которое я могу правильно вынести из столбца имени.В любом случае я могу использовать sed для замены (или удаления) пространства в этом столбце, чтобы можно было легко извлечь этот столбец?

Пример:

 1 2 name 3 4
 12 12 name1 name2 3 4
 12 12 name1 name2 name3 name4 3 4 
 3 4 name 3 4 

-вывод, который я хочу получить:

name 
name1_name2
name1_name2_name3_name4
name

Спасибо,

Амир,

Ответы [ 4 ]

2 голосов
/ 24 октября 2011

Одно решение с использованием awk:

cat foo | awk '{ for(i=3; i<=NF-3; i++) { printf $i "_"; } printf $i "\n";  }'

Вот то же самое, используя sed:

cat foo  | sed -e 's/^[0-9 ]*//g' -e 's/ [0-9 ]*$//g' -e 's/ /_/g'

POSIX-совместимый для ясности:

cat foo  | sed -e 's/^[[:digit:][:space:]]*//g' -e 's/[[:space:]]*[[:digit:][:space:]]*$//g' -e 's/ /_/g'
1 голос
/ 24 октября 2011

другой способ без циклов

 awk 'BEGIN{OFS="_"}{$1=$2=$NF=$(NF-1)="";gsub(/__/,"")}1' yourFile

тест

kent$  cat t
 1 2 name 3 4
 12 12 name1 name2 3 4
 12 12 name1 name2 name3 name4 3 4 
 3 4 name 3 4 

kent$  awk 'BEGIN{OFS="_"}{$1=$2=$NF=$(NF-1)="";gsub(/__/,"")}1' t
name
name1_name2
name1_name2_name3_name4
name
1 голос
/ 24 октября 2011
sed 's/^[0-9]\+ [0-9]\+ \(.*\) [0-9]\+ [0-9]\+$/\1/;s/ /_/g'
0 голосов
/ 24 октября 2011

Пара вариантов Perl

perl -lne  '/\d+ \d+ (.+) \d+ \d+/ and do {($_ = $1) =~ s/ /_/g; print}'
perl -lape  'for (1..2) {shift @F; pop @F}; $_ = join "_", @F'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...