在awk中使用printf,如何使换行在旧行结束后开始(对于MS-DOS换行文件)
我正在尝试使用Awk将文件中的行连接在一起。当然,我试过类似的方法在awk中使用printf,如何使换行在旧行结束后开始(对于MS-DOS换行文件),awk,Awk,我正在尝试使用Awk将文件中的行连接在一起。当然,我试过类似的方法 awk '{printf (%s), $0}' file.name 然而,不是将所有内容连接到一行,而是获得标准输出。我只听到最后一行。然后我意识到,在每行执行printf时,我的awk实际上会用新输出重写旧输出 如何避免这种行为?我想在现有输出的末尾写下一行。例如 如果文件是 abcd abcd abcd eeffgg ssss 预期输出应为 abcd abcd abcdeeffgg ssss 而不是 eeffgg ss
awk '{printf (%s), $0}' file.name
然而,不是将所有内容连接到一行,而是获得标准输出。我只听到最后一行。然后我意识到,在每行执行printf时,我的awk
实际上会用新输出重写旧输出
如何避免这种行为?我想在现有输出的末尾写下一行。例如
如果文件是
abcd abcd abcd
eeffgg ssss
预期输出应为
abcd abcd abcdeeffgg ssss
而不是
eeffgg ssssbcd
或
更具体地说,我使用的是OSX,所以我假设我使用的awk是unix版本。因此,这种行为可能不同于GNU的
awk
进一步调试导致独立问题。该问题不是由unix版本的awk引起的。这是由文件中的MS-DOS断线器样式引起的 因为我试图处理的文件是由基于MS-DOS的系统自动生成的。它使用的是
^M
,而不是unix样式的换行符。这就是问题的根源。使用sed
转换换行符可以解决此问题。示例输入:
cat file.name
abcd abcd abcd
eeffgg ssss
使用粘贴的解决方案
:
paste -sd' ' file.name
abcd abcd abcd eeffgg ssss
使用tr
的解决方案:
tr -d '\n' <file.name
样本输入:
cat file.name
abcd abcd abcd
eeffgg ssss
使用粘贴的解决方案
:
paste -sd' ' file.name
abcd abcd abcd eeffgg ssss
使用tr
的解决方案:
tr -d '\n' <file.name
您可以在打印时从\r\n
中删除“^M
”(或\r
):
awk '{sub(/\r/,""); printf "%s", $0} END {print ""}' file
abcd abcd abcdeeffgg ssss
删除sub(/\r/,“”)
\r
输出printf“%s”,不带换行符的$0
在字符串的末尾添加一个换行符END{print”“}
子部分。如果我使用问题附带的示例数据。我正在Linux中使用gawk:
$ cat > file # cat it to a file
abcd abcd abcd
eeffgg ssss
$ unix2dos file # convert to DOS enters \r\n
unix2dos: converting file file to DOS format ...
$ file file # make sure
file: ASCII text, with CRLF line terminators
$ awk '{printf (%s), $0}' file # run OP's program
$ # there was no visible output due to \r
然后,我继续将END{print”“}
添加到OP的程序中:
$ awk '{printf "%s", $0} END {print ""}' file
eeffgg ssssbcd
$ # last line is visible due to print "" end END
然后,我将子部分添加到程序中:
$ awk '{sub(/\r/,""); printf "%s", $0} END {print ""}' file
abcd abcd abcdeeffgg ssss
$ # and we acquire the requested output
因此,我不认为不需要子部分。您可以在打印时从\r\n
中删除“^M
”(或\r
):
awk '{sub(/\r/,""); printf "%s", $0} END {print ""}' file
abcd abcd abcdeeffgg ssss
sub(/\r/,“”)
删除\r
printf“%s”,不带换行符的$0
输出
END{print”“}
在字符串的末尾添加一个换行符
附录:
有一条评论声称不需要子部分。如果我使用问题附带的示例数据。我正在Linux中使用gawk:
$ cat > file # cat it to a file
abcd abcd abcd
eeffgg ssss
$ unix2dos file # convert to DOS enters \r\n
unix2dos: converting file file to DOS format ...
$ file file # make sure
file: ASCII text, with CRLF line terminators
$ awk '{printf (%s), $0}' file # run OP's program
$ # there was no visible output due to \r
然后,我继续将END{print”“}
添加到OP的程序中:
$ awk '{printf "%s", $0} END {print ""}' file
eeffgg ssssbcd
$ # last line is visible due to print "" end END
然后,我将子部分添加到程序中:
$ awk '{sub(/\r/,""); printf "%s", $0} END {print ""}' file
abcd abcd abcdeeffgg ssss
$ # and we acquire the requested output
所以我不觉得不需要子部分。请输入和预期输出示例?@PS.Done,输入和预期输出已添加。`tr-d'\n'@PS。尝试过,不知何故输出是空的……OSX awk与GNU awk或任何其他awk相比,不再是unix版本的。这只是OSX awk。您应该了解GNU awk-OSX awk有一些问题,使您的工作更加困难,因为您必须继续解决这些问题,GNU awk有大量非常有用的扩展,例如,通过OSX awk不支持的多字符RS(-v RS='\r?\n'
)处理您的数据。你说使用sed解决了这个问题
-当你已经在使用awk并且awk可以做sed能做的任何事情时,为什么还要添加sed调用s/\r//
只是awk中的sub(/\r/,“”)
而已。请输入和预期输出示例?@PS.完成,输入和预期输出已添加。`tr-d'\n'@PS.尝试过,不知何故输出是空的……OSX awk与GNU awk或任何其他awk相比,不再是unix版本的。这只是OSX awk。您应该了解GNU awk-OSX awk有一些问题,使您的工作更加困难,因为您必须继续解决这些问题,GNU awk有大量非常有用的扩展,例如,通过OSX awk不支持的多字符RS(-v RS='\r?\n'
)处理您的数据。你说使用sed解决了这个问题
-当你已经在使用awk并且awk可以做sed能做的任何事情时,为什么还要添加sed调用s/\r/
只是awk中的sub(/\r/,“”)
。awk命令awk'BEGIN{ORS=”“}{$1=$1}1'}文件。name
的末尾有一个无关的}
。它还将把所有的空格链(包括制表符等)转换为单个空白字符,而不是OP所希望的。awk命令awk'BEGIN{ORS=”“}{$1=$1}1'}文件。name
的末尾有一个无关的}
。它还将转换所有空白链,包括选项卡等。,对于OP表示不需要的单个空白字符。带sub的第一部分是不必要的,没有sub也可以。@ClaesWikner我添加了一个示例来说明为什么在解决问题的方法中需要sub
部分。带sub的第一部分是不必要的,没有sub也可以。@ClaesWikner我添加了一个示例来说明为什么在我解决问题的方法中需要子部分。