有没有办法在awk-gawk中最有可能将记录分隔符RS
设置为空值,以将字符串的每个字符作为单独的记录处理?有点像将FS
设置为空以分隔其自己字段中的每个字符:
$ echo abc | awk -F '' '{print $2}'
b
但要将它们分开作为单独的记录,例如:
$ echo abc | awk -v RS='?' '{print $0}'
a
b
c
最明显的一个:
$ echo abc | awk -v RS='' '{print $0}'
abc
没有奖励我(因为那个人显然是为了GNU awk documentation的其他东西)。
我基本上使用for
等等吗?
修改:
A
:):
$ echo abc | awk -v A="\n" -v RS='(.)' -v ORS="" '{print(RT==A?NR:RT)}'
abc4
不会使用length
来帮助我缩短之前的code。然后,我怎么能赢得Pyth代码:+Qfql+Q
:D。
答案 0 :(得分:4)
如果您只想每行打印一个字符,@ klashxx的答案就可以了。但是,因为你打高尔夫球,sed 's/./&\n/g'
会更短。
如果您真的想为每个角色分别创建一个记录,我找到的最佳解决方案是:
echo -n abc | awk -v RS='(.)' '{ print RT }'
(使用gawk
;您的输入字符位于RT
,而不是$1
)
[update]如果RS
设置为空字符串,则意味着awk
记录由空行分隔。如果我刚刚定义了RS='.'
,则记录分隔符将只是一个点(即固定字符串)。但如果其长度超过一个字符,gawk
的一个特征就是将RS
视为正则表达式。所以,我在这里做的是给gawk
一个正则表达式意义"每个字符"作为记录分隔符。我使用gawk
的另一个特性:检索与特殊变量RT
(记录终止符)中的正则表达式匹配的字符串
以下是gwak
手册的相关部分:
通常,记录由换行符分隔。您可以通过为内置变量RS分配值来控制记录的分隔方式。如果RS是任何单个字符,则该字符将分隔记录。否则,RS是正则表达式。与此正则表达式匹配的输入中的文本将分隔记录。
如果RS设置为空字符串,则记录由空行分隔。
Gawk将RT设置为与RS指定的字符或正则表达式匹配的输入文本。
答案 1 :(得分:3)
空字符串"" (没有任何字符的字符串)有一个特殊的 意思是 RS 的值。这意味着记录由一个分隔开 或更多的空白行,没有别的。
只是替代:
echo abc | awk 'BEGIN{FS="";OFS="\n"}$1=$1'
答案 2 :(得分:3)
没有RS
的设置可以做你想要的。看起来您的要求是在每个不是换行符的字符后附加换行符,如果是这样,这将产生您想要的输出:
$ echo 'abc' | awk -v ORS= 'gsub(/[^\n]/,"&\n")'
a
b
c
这适用于任何UNIX系统上的任何awk。