对于gawk,如何在与awk脚本相同的命令中设置FS和RS?

对于gawk,如何在与awk脚本相同的命令中设置FS和RS?,awk,Awk,我有一个awk命令,它返回输入流中的重复项 awk'{a[$0]+}END{for(a中的i)if(a[i]>1)print i;}' 但是,我想在执行此操作之前更改字段分隔符和记录分隔符。我使用的命令是 FS='\n'RS='\n\n' 但我很难做到这一点。有没有办法将这两个命令有效地结合在一起?从一个管道到另一个管道似乎也不起作用。在读取任何输入之前执行开始规则的操作 awk 'BEGIN{FS="\n";RS="\n\n"}{a[$0]++}END{for (i in a)if (a[i]

我有一个awk命令,它返回输入流中的重复项

awk'{a[$0]+}END{for(a中的i)if(a[i]>1)print i;}'

但是,我想在执行此操作之前更改字段分隔符和记录分隔符。我使用的命令是

FS='\n'RS='\n\n'


但我很难做到这一点。有没有办法将这两个命令有效地结合在一起?从一个管道到另一个管道似乎也不起作用。

在读取任何输入之前执行
开始
规则的操作

awk 'BEGIN{FS="\n";RS="\n\n"}{a[$0]++}END{for (i in a)if (a[i]>1)print i;}'
也可以使用命令行选项指定它们,如:

awk -F '\n' -v RS='\n\n' '{a[$0]++}END{for (i in a)if (a[i]>1)print i;}'

通过硬编码
\n
您已经使您的
awk
脚本与您的平台紧密耦合。@sjsam不是我,OP是这样做的吗?为什么当您的脚本根本不使用FS,而不是在非空行之后立即使用FS时,您要更改FS或RS,当RS是
\n
\n\n
时,您的行为不会改变?如果您提供简洁、可测试的示例输入和预期输出,我们可以帮助您以正确的方式执行任何操作。@jas通过将
RS
设置为
ORS
,我想这是值得注意的。因此,为了保留文件结构,op可能需要类似于
BEGIN{ORS=RS RS;RS=”“}
的东西,假设一个空行是记录分隔符。@jas设置
RS=“”
不会将
FS
视为
“\n”
。如果需要,您需要手动设置
FS=“\n”
。设置
RS=”“
对FS的作用是,如果FS只是一个字符,则在字段分隔符集中添加“\n”。因此,如果您使用的默认FS无效,因为
\n
已经是默认FS的“连续空白”字符集中包含的字符之一,但如果您使用的是
FS=“,”
,则设置
RS=“”
将使脚本的行为与您指定的
FS=“,\n]”
类似。如果您使用的是
FS=“,”
,那么
RS=“
将不会更改。希望澄清!一如既往地感谢,@EdMorton,对所有的错误信息表示歉意[:face palm:。@kvantour-来自Arnold:
这闻起来像是POSIX标准的变化,但我必须研究以前的标准以及原始AWK书籍所说的。
。当他再次给我回电话时,我会尽量记得给你回电话,但如果你没有收到我的回复,请在几天后提醒我。