可以设置RS"空"将字符串字符拆分为记录?

时间:2016-12-23 10:45:32

标签: awk gawk

有没有办法在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等等吗?

修改

@ 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。

3 个答案:

答案 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)

not possible

  

空字符串"" (没有任何字符的字符串)有一个特殊的   意思是 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。