让内容为 -
的文件abcdefghijklmn
pqrstuvwxyzabc
defghijklmnopq
通常,如果执行任何使用awk的操作,它会逐行迭代并在每一行上执行该操作。
例如:
awk '{print substr($0,8,10)}' file
O / P:
hijklmn
wxyzabc
klmnopq
我想知道一种方法,其中文件中的所有内容都被视为单个变量,而awk
只打印一个输出。
所需的O / P示例:
hijklmnpqr
并不是我希望获得给定问题的所需输出,但总的来说,如果有人可以提出一种方法来将文件的内容作为一个整体提供给awk,那么通常会很感激。
答案 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
如果真的你想要什么。