用逗号替换新行,但我需要一行文件
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】:
使用awk
和printf
的一个想法(没有'\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 我尝试将它添加到一个文件中,它显示它在一行上。为什么我们要打印它时它没有显示? 如果这对您不起作用,我不确定会出现什么问题。请通过 edit 将od -v -t x1 -An display.txt
的输出添加到您的问题中,以便我们可以尝试重现您的问题。不要不要将其作为评论发布。
我添加了您要的内容,请查看
@ClarkRouhana 感谢您添加 hexdump。我将-E
选项添加到sed
,现在可以在文件中获得预期的输出。
我编辑了我的问题,请您检查一下。以上是关于用逗号替换新行,但我需要一行文件的主要内容,如果未能解决你的问题,请参考以下文章