AWK整体读取文件

Ash*_*h K 1 linux bash shell awk

让内容如下的文件-

abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq
Run Code Online (Sandbox Code Playgroud)

通常,如果执行任何使用awk的操作,则会逐行迭代并在每行上执行该操作。

例如:

awk '{print substr($0,8,10)}' file
Run Code Online (Sandbox Code Playgroud)

O / P:

hijklmn
wxyzabc
klmnopq
Run Code Online (Sandbox Code Playgroud)

我想知道一种方法,其中文件内的所有内容都被视为一个变量,awk仅输出一个输出。

所需的O / P示例:

hijklmnpqr
Run Code Online (Sandbox Code Playgroud)

我并不是希望为给定的问题获得期望的输出,但是总的来说,如果有人可以提出一种向awk提供整个文件内容的方法,我将不胜感激。

Jua*_*doy 6

这是一个gawk解决方案

文档

有时您可能希望将整个数据文件视为一条记录做到这一点唯一方法是给RS一个您知道在输入文件中没有出现的值。通常很难做到这一点,以使程序始终可用于任意输入文件。


$ cat file
abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq
Run Code Online (Sandbox Code Playgroud)

RS必须被设置为一个图案在归档不存在,以下丹尼斯施罗科夫上的文档(建议感谢@EdMorton):

$ gawk '{print ">>>"$0"<<<<"}' RS='^$' file
>>>abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq

abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq
<<<<
Run Code Online (Sandbox Code Playgroud)

诀窍用粗体字

通过将RS设置为^$,可以正常工作,如果文件包含内容,则该正则表达式将永远不匹配。gawk将文件中的数据读取到tmp中,尝试匹配RS。每次读取后匹配失败,但很快失败,从而gawk用文件的全部内容填充tmp


所以:

$ gawk '{gsub(/\n/,"");print substr($0,8,10)}' RS='^$' file
Run Code Online (Sandbox Code Playgroud)

返回值:

hijklmnpqr
Run Code Online (Sandbox Code Playgroud)