Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在awk中使用printf,如何使换行在旧行结束后开始(对于MS-DOS换行文件)_Awk - Fatal编程技术网

在awk中使用printf,如何使换行在旧行结束后开始(对于MS-DOS换行文件)

在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将文件中的行连接在一起。当然,我试过类似的方法

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我添加了一个示例来说明为什么在我解决问题的方法中需要
子部分。