gpt4 book ai didi

unix - 为什么我的工具输出会覆盖自身,我该如何修复?

转载 作者:行者123 更新时间:2023-12-04 02:58:10 25 4
gpt4 key购买 nike

这个问题的目的是为日常问题提供一个答案,这些问题的答案是“你有 DOS 行结尾”,这样我们就可以简单地将它们关闭为这个问题的重复,而不会令人作呕地重复相同的答案。

注意:这不是任何现有问题的重复 .此问答的目的不仅是提供“运行此工具”的答案,而且是为了解释问题,以便我们可以将任何有相关问题的人指向此处,他们也会清楚地解释为什么指向此处作为工具运行所以解决他们的问题。我花了几个小时阅读所有现有的问答,但它们都缺乏对问题的解释、可用于解决问题的替代工具和/或可能解决方案的优缺点/注意事项。此外,他们中的一些人已经接受了那些完全危险且永远不应使用的答案。

现在回到 典型问题这将导致在此处进行推荐:

我有一个包含 1 行的文件:

what isgoingon

当我使用这个 awk 脚本打印它来反转字段的顺序时:
awk '{print $2, $1}' file

而不是看到我期望的输出:
isgoingon what

我得到应该在行尾的字段出现在行首,覆盖了行首的一些文本:
 whatngon

或者我将输出分成两行:
isgoingon
what

可能是什么问题,我该如何解决?

最佳答案

问题是您的输入文件使用 CRLF 的 DOS 行结尾而不是仅 LF 的 UNIX 行结尾并且您正在其上运行 UNIX 工具,因此 CR仍然是 UNIX 工具操作的数据的一部分。 CR通常表示为 \r当您运行 ^M 时,可以将其视为 control-M ( cat -vE )在文件上同时 LF\n并显示为 $cat -vE .

所以你的输入文件不仅仅是:

what isgoingon

它实际上是:
what isgoingon\r\n

正如您所看到的 cat -v :
$ cat -vE file
what isgoingon^M$

od -c :
$ od -c file
0000000 w h a t i s g o i n g o n \r \n
0000020

因此,当您在文件上运行像 awk 这样的 UNIX 工具(将 \n 视为行尾)时, \n被阅读该行的行为所消耗,但这将 2 个字段保留为:
<what> <isgoingon\r>

请注意 \r在第二个字段的末尾。 \r意味着 Carriage Return这实际上是将光标返回到行首的指令,因此当您执行以下操作时:
print $2, $1

awk 将打印 isgoingon然后将光标返回到打印前的行首 what这就是为什么 what似乎覆盖了 isgoingon 的开头.

要解决此问题,请执行以下任一操作:
dos2unix file
sed 's/\r$//' file
awk '{sub(/\r$/,"")}1' file
perl -pe 's/\r$//' file

显然 dos2unix又名 frodos在某些 UNIX 变体(例如 Ubuntu)中。

如果您决定使用 tr -d '\r',请小心正如经常建议的那样,这将删除 全部 \r s 在您的文件中,而不仅仅是在每行末尾的那些。

请注意,GNU awk 将允许您通过简单地设置 RS 来解析具有 DOS 行结尾的文件。适本地:
gawk -v RS='\r\n' '...' file

但其他 awks 不允许这样做,因为 POSIX 只要求 awks 支持单个字符 RS,而大多数其他 awks 会悄悄地截断 RS='\r\n'RS='\r' .您可能需要添加 -v BINMODE=3让 Gawk 甚至可以看到 \r s 虽然底层 C 原语会在某些平台上剥离它们,例如赛格温。

需要注意的一件事是,由 Excel 等 Windows 工具创建的 CSV 将使用 CRLF作为行尾,但可以有 LF s 嵌入在 CSV 的特定字段中,例如:
"field1","field2.1
field2.2","field3"

是真的:
"field1","field2.1\nfield2.2","field3"\r\n

所以如果你只是转换 \r\n转至 \n s 那么您不能再将字段内的换行从换行中区分为行尾,因此如果您想这样做,我建议首先将所有字段内换行转换为其他内容,例如这将转换所有域内 LFs到制表符并转换所有行结尾 CRLF转至 LF s:
gawk -v RS='\r\n' '{gsub(/\n/,"\t")}1' file

在没有 GNU awk 的情况下做类似的事情作为练习,但对于其他 awk,它涉及组合不以 CR 结尾的行。当他们阅读时。

关于unix - 为什么我的工具输出会覆盖自身,我该如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45772525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com