2013-08-11 5 views
0

Мне было интересно, как фильтровать только имя языка программирования из txt-файла. я использовал следующее предложение в AWK, но я не могу получить то, что я хочу:Печать только некоторых столбцов в awk

($1 ~ /[A-Za-z]*/) && (($3 ~ /-/) || ($4 ~ /-/)) 

Любые идеи о том, как это сделать? Потому что, как вы видите, нет регулярного способа написания строк.

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

2.PAK - AI language with coroutines. "The 2.PAK Language: Goals and 
Description", L.F. Melli, Proc IJCAI 1975. 

473L Query - English-like query language for Air Force 473L system. Sammet 
1969, p.665. "Headquarters USAF Command and Control System Query 
Language", Info Sys Sci, Proc 2nd Congress, Spartan Books 1965, pp.57-76. 

3-LISP - Brian Smith. A procedurally reflective dialect of LISP which uses 
an infinite tower of interpreters. 

Я просто хочу, чтобы фильтровать и сделать появляются следующие строки:

2.PAK 

473L Query 

3-LISP 

Редактировать: Теперь будет ли такое же предложение работать для следующего?

DML - 

    1. Data Management Language. Early ALGOL-like language with lists, 
graphics, on Honeywell 635. 

    2. "DML: A Meta-language and System for the Generation of Practical and 
Efficient Compilers from Denotational Specifications" 

Я предполагаю, что я просто должен исправить некоторые из RS и FS вещей, так что я могу получить эту линию?

DML 

Заранее благодарен!

ответ

0

Если я правильно понимаю, что ваш файл состоит из многострочных «строфы», которые разделены пустыми строками, и каждая «строфа» начинается с-названием языка с последующим  - , то вы можете написать:

awk 'BEGIN { RS = "\n\n"; FS = " - " } { print $1 }' 

Блок BEGIN (который запускается до считывания первой записи) устанавливает разделитель записи RS в "\n\n" (две строки новой строки, то есть пустая строка), поэтому каждая из ваших строф представляет собой одну запись AWK, а разделитель полей FS -  - , поэтому имя языка является первым «полем» строфы. Блок { print $1 } печатает первое поле в каждой записи.

+0

Спасибо за быстрый Отвечает! @ruakh. Это помогло мне решить проблему. –

+0

@ MikePrees: Добро пожаловать! Если бы вы могли отметить это как принятый ответ, я был бы признателен. (См. [«Как работает прием ответа?» При переполнении метаданных] (http://meta.stackexchange.com/a/5235/172535).) – ruakh

+0

Да. Но теперь у меня есть сомнения, я изменил RS, поэтому я могу отфильтровать следующие строки и просто получить ESP: ESP - 1. Extra Simple Pascal. Подмножество Паскаля. 2. Эконометрический программный пакет. Статистический анализ временных рядов. Что я написал в awk-программе, это BEGIN {RS = "\ n \ n \ n \ n \ n"; FS = "-"} Но я не могу заставить его работать, любая идея почему? –

1

Похоже, "-" может быть хорошим разделителем, учитывая файл:

$ cat /tmp/a 
2.PAK - AI language with coroutines. "The 2.PAK Language: Goals and 
Description", L.F. Melli, Proc IJCAI 1975. 

473L Query - English-like query language for Air Force 473L system. Sammet 
1969, p.665. "Headquarters USAF Command and Control System Query 
Language", Info Sys Sci, Proc 2nd Congress, Spartan Books 1965, pp.57-76. 

3-LISP - Brian Smith. A procedurally reflective dialect of LISP which uses 
an infinite tower of interpreters. 

вы можете использовать следующие:

$ awk -F ' - ' '/ - /{ print $1 }' /tmp/a 
2.PAK 
473L Query 
3-LISP 
$ 
+0

Спасибо за ваш ответ @cyberz –

+0

Добро пожаловать. Также та же команда может проанализировать добавленный вами DML-пример. – cyberz

+0

Как вы напишете это как файл awk? Я имею в виду не только в темном порядке, как вы разместили –

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