在批处理文件中运行awk时没有行结尾

时间:2014-07-23 09:40:29

标签: batch-file awk newline

从Windows下的命令shell运行awk命令,并提供此输出

a a a
b b b
c c c

当我在批处理文件中保存该命令并运行它时,我得到了

a a a b b b c c c

<小时/> 已经从GnuWin32安装了awk,我使用的是GNU Awk 3.1.6版本。 有问题的awk命令是awk "ORS=NR%3?FS:RS" input_file
输入文件是

a
a
a
b
b
b
c
c
c

<小时/> 如何恢复我的行结尾?


经过一些实验后的结果:

  • awk "1" input_file
    给出CR + LF行结尾,在文件末尾添加一个额外的行(input_file缺少)

  • awk -v ORS=. "1" input_file
    将此作为输出:a.a.a.b.b.b.c.c.c.(无行结束)

  • Ed Morton的第一批提案 - 见下文 - (使用\r\n而不使用单引号')都会产生相同的输出,无论RSORS的设置如何:所有输出都以CR + LF行结尾给出

  • 添加-v BINMODE=3后,我得到了不同的结果: 所有输出仍然以CR + LF行结尾给出,但对于某些命令,双行结尾打印出0x0D 0x0A 0x0D 0x0A。下表列出了每个输入行产生两个行结尾的哪些组合,空白产生单行结尾:

           ORS : \n | \r | \r\n
    -----------+----+----+-------
            \n |    | XX |  XX
      RS:   \r | XX |    |  XX
          \r\n |    |    |
    
  • btw,我之所以删除RSORS值中的单引号,是因为所有输出都在最后添加了一个或两个单引号 - 并且仅在结尾处:单个ORS='\r'时,其中两个以其他值之间的行结尾。使用双引号会产生与不使用引号相同的结果。

2 个答案:

答案 0 :(得分:3)

如果GnuWin32包含paste,则更简单的选择是:paste - - - < filename

答案 1 :(得分:0)

将您的三元表达式括号括起来:

awk "ORS=NR%3?FS:RS"

是不明确的,会在某些awks上产生语法错误,因此将其更改为:

awk "ORS=(NR%3?FS:RS)"

但这可能无法解决您的问题。

现在尝试awk -v RS='\n' -v ORS='\r\n' ...并将您的脚本更改为1,以查看是否再现了行结尾。 GOT与行结尾有关,因此RS和ORS的\r\n的某种组合必须这样做。

另外,请尝试设置-v BINMODE=3 - 不确定它是否会影响您的环境,但不要确定是否需要gkk来查看\r

所以,试试这些,看看哪个再现了行结尾:

awk -v RS='\n' -v ORS='\n' "1" input_file
awk -v RS='\r' -v ORS='\n' "1" input_file
awk -v RS='\r\n' -v ORS='\n' "1" input_file

awk -v RS='\n' -v ORS='\r' "1" input_file
awk -v RS='\r' -v ORS='\r' "1" input_file
awk -v RS='\r\n' -v ORS='\r' "1" input_file

awk -v RS='\n' -v ORS='\r\n' "1" input_file
awk -v RS='\r' -v ORS='\r\n' "1" input_file
awk -v RS='\r\n' -v ORS='\r\n' "1" input_file

如果他们都没有,那么尝试向每个人添加-v BINMODE=3,例如:

awk -v BINMODE=3 -v RS='\n' -v ORS='\n' "1" input_file
awk -v BINMODE=3 -v RS='\r' -v ORS='\n' "1" input_file
awk -v BINMODE=3 -v RS='\r\n' -v ORS='\n' "1" input_file

awk -v BINMODE=3 -v RS='\n' -v ORS='\r' "1" input_file
awk -v BINMODE=3 -v RS='\r' -v ORS='\r' "1" input_file
awk -v BINMODE=3 -v RS='\r\n' -v ORS='\r' "1" input_file

awk -v BINMODE=3 -v RS='\n' -v ORS='\r\n' "1" input_file
awk -v BINMODE=3 -v RS='\r' -v ORS='\r\n' "1" input_file
awk -v BINMODE=3 -v RS='\r\n' -v ORS='\r\n' "1" input_file

然后更新任何一个用"1"取代"ORS=(NR%3?FS:RS)"