2015-04-10 2 views
1

У меня есть .txt файл, содержащийКак удалить поля, содержащие определенную строку или символ?

Name: Dean AGE: 23 Hometown: Chicago 
Name: Mary AGE: 68 hometown: New York 
Name: Lisa age: 36 Hometown: Los angeles 
Name: Greg Age: 18 hometown: London 

Как бы я SED, AWK, или тр "Имя:", "Возраст:" и "Родной город:" поэтому результат:

Dean 23 Chicago 
Mary 68 New York 
Lisa 36 Los angeles 
Greg 18 London 

Единственное, что я могу думать о том, чтобы AWK через все поля и распечатать их, такие как:

awk '{for (i=1;i<=NF;i++) {if ($i !~/:/) {print i,$i}}}' 

Однако это дает мне результат:

Dean 
23 
Chicago 
Mary 
68 
New 
York 
Lisa 
36 
Los 
angeles 
Greg 
18 
London 

Как вы можете видеть, оно распечатывает каждое поле на своей собственной линии и разбивает Нью и Йорк, а также Лос и ангелы.

Другая идея, которую я имел, заключалась в том, чтобы sed «Name:», «Age:» и «Hometown:» один за другим, все с разными командами, которые заменяют их ничем, что бы сработало. Пример:

sed 's/Name://g' 

Однако, есть способ сделать это, не чувствительны к регистру, так как есть "возраст:", "Возраст:" и "AGE:"

+0

Будет ли файл всегда иметь имя, возраст и родной город в этом порядке ни с чем еще до или между ними? – amaurea

+0

он всегда будет в порядке. Однако после города есть и другие элементы. я просто сокращаю их для краткости. – wolfclique

ответ

4

Если у вас есть GNU SED он имеет возможность I для регистронезависимого матча:

sed 's/Name://gI;s/Age://gI;s/Hometown://gI' file 

с небольшим изменением, решение AWK будет работать:

awk '{ for(i=1;i<=NF;i++) {if ($i ~/:/) {$i=""}} ; print }' file 
+0

Обе эти работы, за исключением того, что они помещают «» перед именами людей. Любая идея, как избавиться от него? – wolfclique

+0

Nevermind. Я могу просто sed/// '. Но если у вас есть другие идеи, я бы с удовольствием их услышал. Спасибо за помощь. – wolfclique

+0

@wolfclique: Да, команда 'sed' легко исправить, добавив пробел в каждое регулярное выражение, но это не так просто в случае' awk': insert '$ 0 = substr ($ 0,2); gsub ("", ""); 'перед' print'. ПРИМЕЧАНИЕ. 1-й аргумент 'gsub' должен быть _2_ пробелами, но к моему недоразумению это сжато до _1_ форматированием комментариев. – mklement0

2

Вы можете использовать эту команду гну-AWK также:

awk -v IGNORECASE=1 -v OFS='\t' -F ' *(Name|AGE|Hometown): *' ' { 
     printf $2; for (i=3; i<=NF; i++) printf OFS $i; print ""}' file 
Dean 23 Chicago 
Mary 68 New York 
Lisa 36 Los angeles 
Greg 18 London 
+1

Хм я исправил его. Я думаю, что пример [этого руководства gnu awk] (https://www.gnu.org/software/gawk/manual/html_node/Case_002dsensitivity.html) был немного запутанным. – anubhava

4
$ awk -F' ?[^ ]+: ' '{print $2, $3, $4}' file 
Dean 23 Chicago 
Mary 68 New York 
Lisa 36 Los angeles 
Greg 18 London 

или вообще для любого количества полей:

$ awk -F' ?[^ ]+: ' '{for (i=2;i<=NF;i++) printf "%s%s", $i, (i<NF?OFS:ORS)}' file 
Dean 23 Chicago 
Mary 68 New York 
Lisa 36 Los angeles 
Greg 18 London 
2

Что об удалении всех слов, оканчивающихся на : от входа и распечатать что осталось?

$ awk '{ gsub(/[^ ]+: /, "") }1' data.txt 
Dean 23 Chicago 
Mary 68 New York 
Lisa 36 Los angeles 
Greg 18 London 

Edit: И как это было предложено в комментариях, возможно, даже более важно это sed эквивалент:

sed -r 's/[^ ]+: //g' data.txt # gnu 

sed -E 's/[^ ]+: //g' data.txt # bsd 
+0

Ну, конечно, вы МОЖЕТЕ сделать это легко, если хотите ... '+ 1' и смущенный эможи, если бы у меня был такой. Не могли бы вы добавить sed-эквивалент 'sed -r '/ [^] +: // g' file' так, чтобы все было в одном месте? (На самом деле вам не нужно выражение ':' в выражении скобки. –

1

свайных на ответ, с Perl:

Чтобы удалить конкретные метки:

Чтобы удалить ярлык:

perl -pe 's/\w+:\s*//ig' file 

tr не является правильным инструментом, поскольку он отображает символы, а не слова.

+0

Красиво сделано; GNU 'sed' эквиваленты:' sed -r 's/(name | age | hometown): * // Ig' file' и 'sed -r 's/\ w +: * // Ig' file'. Это единственная причина оптимизации??: '(Избегать группы захвата)? – mklement0

+0

Да ........... –

Смежные вопросы