Shell awk字符串连接不工作2(外壳设置错误?)

Shell awk字符串连接不工作2(外壳设置错误?),shell,awk,Shell,Awk,我有一种奇怪的现象,我不明白。我想我在awk中遗漏了一些重要的东西。当有一行包含信号时,我想将整行累积连接到一个名为“c”的字符串。字符串以“a”和“b”的串联开始,这很好 .dat中的文件: 你好! 文件tt.awk: 开始{a=“a”b=“b”c=ab;} /信号/{c=c”“$0;} 结束{print c;} 当我执行awk-f tt.awk in.dat时,我得到(如预期的那样): ab信号你好! 现在我将.dat中的更改为: 你好! 信号你好! 然后我再次执行awk-f tt.

我有一种奇怪的现象,我不明白。我想我在awk中遗漏了一些重要的东西。当有一行包含信号时,我想将整行累积连接到一个名为“c”的字符串。字符串以“a”和“b”的串联开始,这很好

.dat中的文件

你好!
文件
tt.awk

开始{a=“a”b=“b”c=ab;}
/信号/{c=c”“$0;}
结束{print c;}
当我执行
awk-f tt.awk in.dat
时,我得到(如预期的那样):

ab信号你好!
现在我将.dat中的
更改为:

你好!
信号你好!
然后我再次执行
awk-f tt.awk in.dat
并得到:

你好!1.
我希望看到:

ab信号你好!信号你好!

我在CentOS shell上做这件事(在我的
~/.cshrc
文件中有很多设置)。我在我的Cygwin外壳上检查了这些,它像我预期的那样正常工作。我的CentOS外壳设置有问题。可能是什么?

这是DOS行结尾的问题(正如Etan Reisner在上面的评论中所指出的)。第二个版本的.dat中的
使用
\r\n
进行换行,而
awk
无法处理此问题

使用相同的
tt.awk
代码:

$echo“信号Hello1\!\n信号Hello2\!”awk-f tt.awk
ab信号你好!信号你好!
$echo“信号Hello1\!\r\n信号Hello2\!”| awk-f tt.awk
信号你好!1.
想知道这到底在做什么?在UNIX中,将行中的位置重置为最左边的位置,但不会向下发送行(这就是所做的)。DOS将
\n
解释为下行,但不重置到最左边的位置,而UNIX将
\r
视为隐式

下面是一些实验来说明发生了什么:

$echo“信号Hello1\!\r\n信号Hello2\!”
打招呼!
信号你好!
$echo“信号Hello1\!\r信号Hello2\!”
信号你好!
$echo“ab信号Hello1\!\n信号Hello2\!”
ab信号你好!
信号你好!
$echo“ab信号Hello1\!\r信号Hello2\!”
信号你好!1.
特别注意最后两项
awk
为您去除
\n
,但保留
\r
,因此第一行打印为
ab信号Hello1
然后应用
\r
,第二行
信号Hello2写在第一行的顶部。第一行的最后两个字符(
1!
)仍然保留,因为第二行不够长,无法覆盖它们

现在我们知道了问题所在,我们可以修复代码:

开始{a=“a”b=“b”c=ab;}
/信号/{gsub(/\r/,“”);c=c”“$0;}
结束{print c;}

这将从添加到
c

的行中删除所有
\r
我将使用您的代码获得准确的预期结果(
ab SIGNAL Hello1!SIGNAL Hello2!
)。您的shell设置是什么?dat中的
是否有DOS行结尾?使用
cat-vet文件的chk for DOS行结尾
。如果在行尾看到
^M$
,请使用
dos2unix文件
。祝大家好运,谢谢!我从一个从windows带来的大文件开始。对于来自Windows的文件,无论我如何编辑它,它似乎都保持DOS格式。刚才,我在linux中开始了测试,它运行得很好(我以为我用linux中的in.dat进行了测试,但可能是我的错误)。