Que*_*ner 11 gedit command-line libreoffice
我正在尝试将文本文件转换为制表符分隔的电子表格。我的文本文件是这样的:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Run Code Online (Sandbox Code Playgroud)
使用 Gedit 或 LibreOffice 中的标准搜索和替换功能,很容易用选项卡替换行尾。但是如果我只是将回车换为标签,我会得到这个:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Run Code Online (Sandbox Code Playgroud)
但我需要做的是让它看起来像这样:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Run Code Online (Sandbox Code Playgroud)
那么,除了每四行之外,我可以为制表符交换每个行尾字符吗?
我不知道这种条件迭代是否可以在像 Gedit 或 LibreOffice 这样的程序中使用正则表达式完成,所以也许这需要某种命令行函数?我什至不清楚最好的工具是什么。
更新:
我尝试了以下命令:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Run Code Online (Sandbox Code Playgroud)
但是当我尝试tsv在 LibreOffice 中打开生成的文件时,列不太正确。我不确定这是否意味着我没有正确执行上述命令,或者我在 LibreOffice 导入功能中做错了什么:
仅供参考,所需的结果应如下所示:
ste*_*ver 16
您可以使用命令行编辑器,例如sed
sed 'N;N;N;s/\n/\t/g' file > file.tsv
Run Code Online (Sandbox Code Playgroud)
或者,以编程方式,通过使用 GNU sed 的地址运算符向要连接的每一行添加反斜杠行连续字符,n skip m然后使用经典的单行符来连接连续行:
sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'
Run Code Online (Sandbox Code Playgroud)
例如,参见Sed One-Liners 解释:
如果以反斜杠“\”结尾,则在下一行追加一行。
Run Code Online (Sandbox Code Playgroud)sed -e :a -e '/\\$/N; s/\\\n//; ta'
但是恕我直言,使用其他标准文本处理实用程序之一会更容易,例如
paste - - - - < file > file.tsv
Run Code Online (Sandbox Code Playgroud)
(数量-将对应于列数)或
pr -aT -s$'\t' -4 file > file.tsv
Run Code Online (Sandbox Code Playgroud)
(-s$'\t如果您不介意输出由多个选项卡分隔,则可以省略)。
您观察到的奇怪的重新导入行为几乎可以肯定是因为原始文件具有 Windows 样式的 CRLF 行结尾。如果您需要处理来自 Windows 的文件,那么您可以通过各种方式将转换滚动到命令中,例如
tr -d '\r' < file.csv | paste - - - -
Run Code Online (Sandbox Code Playgroud)
或者
sed 'N;N;N;s/\r\n/\t/g' file.csv
Run Code Online (Sandbox Code Playgroud)
前者将删除所有回车,而后者将在每个新行的末尾保留一个 CR(如果目标最终用户在 Windows 上,这可能是您想要的)。
Byt*_*der 13
您可以使用xargs始终将四行合二为一,每行用一个空格分隔:
xargs -d '\n' -n4 < inputfile.txt
Run Code Online (Sandbox Code Playgroud)
-d '\n'将输入分隔符设置为换行符,否则它也会在空格处中断。如果无论如何您每个输入行只有一个单词,您甚至可以省略这一点。
-n4将参数编号(每个输出行的输入项数)设置为 4。
输出:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Run Code Online (Sandbox Code Playgroud)
或者,如果您希望制表符作为分隔符而不是空格,您可以在之后替换它们。但是,如果您的输入行中有空格,它们也会被替换:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Run Code Online (Sandbox Code Playgroud)
输出(取决于浏览器/终端的标签宽度):
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Run Code Online (Sandbox Code Playgroud)