如何解析awk中的单词?

时间:2013-08-15 04:33:42

标签: linux bash unix awk

我想知道如何解析一个如下所示的parragraph:

Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text
And many other lines with text that I do not need

                                    * * * * * * *

Autolisp - Dialect of LISP used by the Autocad CAD package, Autodesk,
Sausalito, CA.

CPL - 

  1. Combined Programming Language.  U Cambridge and U London.  A very
complex language, syntactically based on ALGOL-60, with a pure functional
subset. 

Modula-3* - Incoprporation of Modula-2* ideas into Modula-3.  "Modula-3*:

所以我可以从awk句子中得到以下退出:

Autolisp
CPL
Modula-3*

我尝试过以下句子,因为我想要过滤的文件很大。它是迄今为止所有现有编程语言的列表,但基本上所有行都遵循与上面相同的模式

到目前为止我用过的句子:

BEGIN{$0 !~ /^ / && NF == 2 && $2 == "-"} { print $1 }

BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} /^FLIP -/{print $1,$3}

BEGIN{RS=""; FS=OFS="\n"} {print $1 NF-1}

BEGIN{NF == 2 && $2 == "-" } { print $1 }

BEGIN { RS = "" } { print $1 } 

到目前为止对我有用的句子是:

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

awk -F " - " "/ - /{ print $1 }" file.txt

但它仍会打印或跳过我需要/不需要的行。

感谢您的帮助&响应! 我已经打破了几天,因为我是AWK编程的新手

2 个答案:

答案 0 :(得分:3)

默认FS应该没问题,以避免任何重复的行,您可以将输出传递给sort -u

$ gawk '$2 == "-"  { print $1 }' file | sort -u
Autolisp
CPL
Modula-3*

它可能不会过滤掉您想要的所有内容,但您可以继续添加规则,直到过滤掉错误的数据。

或者,您可以通过使用关联数组来避免使用sort

$ gawk '$2=="-" { arr[$1] } END { for (key in arr) print key}' file 
Autolisp
CPL
Modula-3*

答案 1 :(得分:1)

如果它不必与awk一起使用,可能首先使用grep选择正确形式的行,然后使用sed修剪结束,如下所示:

grep -e '^.* -' | sed -e 's/\(^.*\) -.*$/\1\n/; p;'

编辑:在玩了一些awk之后,看起来问题的一部分是你并不总是有'[languagename] - [stuff]',而是'[languagename] - \ n [stuff]' ,就像示例文本中CPL的情况一样,因此,FS =“ - ”不会在这样的事情上分开。

此外,尝试的一件事可能如下:

BEGIN { r = "^.* -"; }
{
    if (match($0, r)) {
        printf("%s\n", substr($0, 1, RSTART + RLENGTH - 3));
    }
}

我实际上并不太了解awk,但这是我在复制上面的grep和sed所做的最好的猜测。它似乎对您提供的示例文本起作用,至少。