在awk中只打印一些列

我想知道如何从txt文件中过滤编程语言的名称。 我已经在AWK中使用了下面的句子,但是我不能得到我想要的:

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

任何想法如何做到这一点? 因为你可以看到,没有规定的方式写行。

换句话说,我有以下几行,但我只想打印编程语言名称

 2.PAK - AI language with coroutines. "The 2.PAK Language: Goals and Description", LF 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 

提前致谢!

看起来像“ – ”可能是一个很好的分隔符,给定的文件:

 $ cat /tmp/a 2.PAK - AI language with coroutines. "The 2.PAK Language: Goals and Description", LF 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 $ 

如果我理解你的文件是由空行分隔的多行“节”组成的,并且每个“节”以一个语言名称跟着一个字母开头,那么你可以这样写:

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

BEGIN块(在读取第一个记录之前运行)将记录分隔符RS"\n\n" (两条换行符,即空行),因此每个节都是单个AWK记录,字段分隔符FS- ,所以语言名称是节的第一个“字段”。 块{ print $1 }打印每个记录中的第一个字段。