RS可以设置"empty"把字符串字符拆分成记录吗?
Can RS be set "empty" to split string characters to records?
awk 中是否有一种方法——gawk 最有可能——将记录分隔符 RS
设置为空值以将字符串的每个字符作为单独的记录处理?有点像将 FS
设置为空以在其自己的字段中分隔每个字符:
$ echo abc | awk -F '' '{print }'
b
但要将它们分别作为单独的记录,例如:
$ echo abc | awk -v RS='?' '{print [=12=]}'
a
b
c
最明显的一个:
$ echo abc | awk -v RS='' '{print [=13=]}'
abc
没有奖励我(因为根据 GNU awk documentation,那个显然是为了别的东西)。
我基本上是在使用 for
等吗?
编辑:
@xhienne 的回答是我一直在寻找的,但即使使用它(20 个字符和一个有问题的变量 A
:):
$ echo abc | awk -v A="\n" -v RS='(.)' -v ORS="" '{print(RT==A?NR:RT)}'
abc4
不会帮助我缩短之前使用 length
的 code。再说一次,我怎么能赢得 Pyth 代码:+Qfql+Q
:D.
The empty string "" (a string without any characters) has a special
meaning as the value of RS. It means that records are separated by one
or more blank lines and nothing else.
一个简单的替代:
echo abc | awk 'BEGIN{FS="";OFS="\n"}='
如果你只想每行打印一个字符,@klashxx 的回答是可以的。但是 sed 's/./&\n/g'
会更短,因为你正在打高尔夫球。
如果您真的想为每个角色单独记录,我为您找到的最佳解决方案是:
echo -n abc | awk -v RS='(.)' '{ print RT }'
(使用gawk
;您输入的字符在RT
,而不是</code>)</p>
<p>[update] 如果 <code>RS
设置为空字符串,则意味着 awk
记录由空行分隔。如果我刚刚定义了 RS='.'
,记录分隔符将只是一个点(即固定字符串)。但是如果它的长度超过一个字符,gawk
的一个特点是将 RS
视为正则表达式。所以,我在这里所做的是给 gawk
一个正则表达式,意思是 "each character" 作为记录分隔符。我使用了 gawk
的另一个功能:检索与特殊变量 RT
(记录终止符)
中的正则表达式匹配的字符串
这里是gwak
手册的相关部分:
Normally, records are separated by newline characters. You can control how records are separated by assigning values to the built-in variable RS. If RS is any single character, that character separates records. Otherwise, RS is a regular expression. Text in the input that matches this regular expression separates the record.
If RS is set to the null string, then records are separated by blank lines.
Gawk sets RT to the input text that matched the character or regular expression specified by RS.
不,没有 RS
的设置可以满足您的要求。看起来您的要求是在每个不是换行符的字符后附加一个换行符,如果这样,这将产生您想要的输出:
$ echo 'abc' | awk -v ORS= 'gsub(/[^\n]/,"&\n")'
a
b
c
这将适用于任何 UNIX 系统上的任何 awk。
awk 中是否有一种方法——gawk 最有可能——将记录分隔符 RS
设置为空值以将字符串的每个字符作为单独的记录处理?有点像将 FS
设置为空以在其自己的字段中分隔每个字符:
$ echo abc | awk -F '' '{print }'
b
但要将它们分别作为单独的记录,例如:
$ echo abc | awk -v RS='?' '{print [=12=]}'
a
b
c
最明显的一个:
$ echo abc | awk -v RS='' '{print [=13=]}'
abc
没有奖励我(因为根据 GNU awk documentation,那个显然是为了别的东西)。
我基本上是在使用 for
等吗?
编辑:
@xhienne 的回答是我一直在寻找的,但即使使用它(20 个字符和一个有问题的变量 A
:):
$ echo abc | awk -v A="\n" -v RS='(.)' -v ORS="" '{print(RT==A?NR:RT)}'
abc4
不会帮助我缩短之前使用 length
的 code。再说一次,我怎么能赢得 Pyth 代码:+Qfql+Q
:D.
The empty string "" (a string without any characters) has a special meaning as the value of RS. It means that records are separated by one or more blank lines and nothing else.
一个简单的替代:
echo abc | awk 'BEGIN{FS="";OFS="\n"}='
如果你只想每行打印一个字符,@klashxx 的回答是可以的。但是 sed 's/./&\n/g'
会更短,因为你正在打高尔夫球。
如果您真的想为每个角色单独记录,我为您找到的最佳解决方案是:
echo -n abc | awk -v RS='(.)' '{ print RT }'
(使用gawk
;您输入的字符在RT
,而不是</code>)</p>
<p>[update] 如果 <code>RS
设置为空字符串,则意味着 awk
记录由空行分隔。如果我刚刚定义了 RS='.'
,记录分隔符将只是一个点(即固定字符串)。但是如果它的长度超过一个字符,gawk
的一个特点是将 RS
视为正则表达式。所以,我在这里所做的是给 gawk
一个正则表达式,意思是 "each character" 作为记录分隔符。我使用了 gawk
的另一个功能:检索与特殊变量 RT
(记录终止符)
这里是gwak
手册的相关部分:
Normally, records are separated by newline characters. You can control how records are separated by assigning values to the built-in variable RS. If RS is any single character, that character separates records. Otherwise, RS is a regular expression. Text in the input that matches this regular expression separates the record.
If RS is set to the null string, then records are separated by blank lines.
Gawk sets RT to the input text that matched the character or regular expression specified by RS.
不,没有 RS
的设置可以满足您的要求。看起来您的要求是在每个不是换行符的字符后附加一个换行符,如果这样,这将产生您想要的输出:
$ echo 'abc' | awk -v ORS= 'gsub(/[^\n]/,"&\n")'
a
b
c
这将适用于任何 UNIX 系统上的任何 awk。