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提供整个文件内容的方法,我将不胜感激。
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)