是否可以使用 Gedit 或命令行修改文本文件的每四行?

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 导入功能中做错了什么:

在 Calc 中打开 TSV

仅供参考,所需的结果应如下所示:

适当的列

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 解释

  1. 如果以反斜杠“\”结尾,则在下一行追加一行。

    sed -e :a -e '/\\$/N; s/\\\n//; ta'
    
    Run Code Online (Sandbox Code Playgroud)

但是恕我直言,使用其他标准文本处理实用程序之一会更容易,例如

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)