用逗号替换新行,但我需要一行文件

Posted

技术标签:

【中文标题】用逗号替换新行,但我需要一行文件【英文标题】:Replacing new lines with comma, but I need file on a line 【发布时间】:2021-07-13 14:58:43 【问题描述】:

我有 9 个不同的文件,我循环遍历每个文件,并取第一行、第二行和第三行。

这是我的代码:

    if [ -f displayStudentsInfo.txt ];
    then
    rm displayStudentsInfo.txt
    fi

    for f in 20*.txt
    do
    sed -n '1p' "$f" | cut -d' ' -f3 > anyfile.txt
    sed -n '2p' "$f" | cut -d' ' -f2 >> anyfile.txt
    sed -n '3p' "$f" | cut -d' ' -f2- >> anyfile.txt
    sed -E '$!s/\r?$/, /' anyfile.txt | tr -d \\r\\n >> displayStudentsInfo.txt
    done
    cat displayStudentsInfo.txt
    rm anyfile.txt

我已经使用此命令将每个文件添加到一行,但不幸的是,所有文件都添加到同一行。

sed -E '$!s/\r?$/, /' anyfile.txt | tr -d \\r\\n

输出:

201664003, 2.8, Mathematics201700128, 3.2, Pharmacy201703451, 2.2, Political Science201759284, 3.4, Marketing201800082, 3.3, Information Technology Management201800461, 2.7, Information Technology Management201800571, 2.7, Information Technology Management201804959, 3.4, Computer Science201806050, 3.5, Computer Science201806715, 3, Computer Science201942365, 3.6, Computer Science

【问题讨论】:

od -c display.txt 会更直接一些 @markp-fuso 我要求这个输出,因为它可以很容易地使用printf $(tr -d \\n | sed 's/ /\\x/') 反转。 od -c 更容易检查,但是变成一个可以测试命令的实际文件很痛苦。 【参考方案1】:

使用awkprintf 的一个想法(没有'\n',因此所有输出都附加到单行):

awk '
      printf "%s%s", pfx, $0        # print prefix and current line; prefix initially = ""
       pfx=", "                      # set prefix to ", " for subsequent lines
     
END   printf "\m"                  # add a linefeed at the end
' display.txt

这会生成:

201664003, GPA: 3.6, Major: Computer Science

注意:如果如其他 cmets 所示,输入文件中有一些不需要的非打印字符,这可能不起作用。

【讨论】:

【参考方案2】:

似乎您使用的是 Windows 行尾 (CR LF) 而不是 Linux 行尾(只是 LF)。

仍然打印整个文件,但由于 CR,控制台会覆盖已打印的字母。您可以通过查看 hexdump tr '\n' ', ' < display.txt | hexdump -c 来确认这一点。

要解决此问题,请删除 CR。此外,tr 只能替换单个字母。要将单个字母 \n 替换为两个字母 , ,请使用 sed 插入这两个字母。 使用sed,您还可以确保, 仅插入在行之间,而不是在末尾。

sed -E '$!s/\r?$/, /' display.txt | tr -d \\r\\n; echo

tr 还会删除文件末尾的 \n。这打破了每个输出/文件都应该以换行符结尾的约定。因此,我们之后通过执行echo 再次添加该换行符。

sed 命令解释:

$! 除最后一行外的每一行 s/.../.../ 替换 \r? 可选 CR 和行尾前的空字符串(\n) 与,

【讨论】:

我试过了,它给了我同样的意外输出 sed '$!s/\r?$/, /' display.txt | tr -d \\n Major: Computer Science 我尝试将它添加到一个文件中,它显示它在一行上。为什么我们要打印它时它没有显示? 如果这对您不起作用,我不确定会出现什么问题。请通过 editod -v -t x1 -An display.txt 的输出添加到您的问题中,以便我们可以尝试重现您的问题。不要不要将其作为评论发布。 我添加了您要的内容,请查看 @ClarkRouhana 感谢您添加 hexdump。我将-E 选项添加到sed,现在可以在文件中获得预期的输出。 我编辑了我的问题,请您检查一下。

以上是关于用逗号替换新行,但我需要一行文件的主要内容,如果未能解决你的问题,请参考以下文章

shell 用逗号替换 cr\lf

(已关闭)PHP Textarea 替换用 br 标记返回键(新行)而不是将其保存到 txt 文件

将用逗号分隔的所有单词放在新行上[重复]

替换长json字符串中的新行符号[关闭]

将 SED 与新行一起使用

更新一行以基于另一行的转换 (Oracle)