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

Replacing new lines with comma, but I need file on a line

我有 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

好像你有 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 。这打破了每个 output/file 都应该以换行符结尾的约定。因此,我们通过在之后执行 echo 来再次添加该换行符。

sed命令解释:

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

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

awk '
     { printf "%s%s", pfx, [=10=]        # 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

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