awk从整体上读取文件

时间:2017-04-06 09:06:38

标签: linux bash shell awk

让内容为 -

的文件
abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq

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

例如:

awk '{print substr($0,8,10)}' file

O / P:

hijklmn
wxyzabc
klmnopq

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

所需的O / P示例:

hijklmnpqr

并不是我希望获得给定问题的所需输出,但总的来说,如果有人可以提出一种方法来将文件的内容作为一个整体提供给awk,那么通常会很感激。

2 个答案:

答案 0 :(得分:4)

这是一个gawk解决方案

来自docs

  

有时您可能希望将整个数据文件视为单个记录。   实现此目的的唯一方法是为RS提供一个您知道在输入文件中不会出现的值。   这是通常难以做到的,因此程序始终适用于任意输入文件。

$ cat file
abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq

RS必须设置为归档中不存在的模式,在文档上提出Denis Shirokov建议后(感谢@EdMorton ):

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

abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq
<<<<

技巧 以粗体显示

  

它的工作原理是将RS设置为^$,这是一个永远不会的正则表达式   匹配文件是否包含内容。 gawk将文件中的数据读入   tmp,尝试匹配RS。 每次阅读后匹配失败,但很快失败,因此gawk用文件的全部内容填充tmp

所以:

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

返回:

hijklmnpqr

答案 1 :(得分:2)

使用GNU awk进行多字符RS(最佳方法):

$ awk -v RS='^$' '{print substr($0,8,10)}' file
hijklmn
pq

如果您的输入不能包含NUL字符,则使用其他awks:

$ awk -v RS='\0' '{print substr($0,8,10)}' file
hijklmn
pq

否则还有其他问题:

$ awk '{rec = rec $0 ORS} END{print substr(rec,8,10)}' file
hijklmn
pq

请注意,这些都不会产生您想要的输出:

hijklmnpqr

因为他们按你所说的去做(换行只是输入文件中的另一个字符,没什么特别的):

"read file as a whole"

要获得您想要的输出,首先需要从文件中删除所有换行符。您可以使用gsub(/\n/,"")或其他各种方法执行此操作,例如:

$ awk '{rec = rec $0} END{print substr(rec,8,10)}' file
hijklmnpqr

如果真的你想要什么。