gpt4 book ai didi

linux - 如何根据需要将所有文件合并为一个文件

转载 作者:行者123 更新时间:2023-12-02 09:38:15 26 4
gpt4 key购买 nike

一个文件夹中有 1000 个 txt 文件。文件内容如下:

("a1", "b1")

我想将所有文件合并为一个文件。但是,我必须用逗号分隔每个文件的内容。

("a1", "b1"), ("a2", "b2")

然后我需要在开头和结尾添加一个固定的文本,如下所示。

START ("a1", "b1"), ("a2", "b2") END

但是,只要要添加的文件数为100,就应该创建一个新行。

例子:

START ("a1", "b1"), ("a2", "b2") ... END
...
START ("a900", "b900"), ("a901", "b901") ... END

我在示例中给出的值只是为了以更简单的方式解释的示例。

我需要将其编写为 bash 脚本以在服务器上运行。

我能够执行以下操作,但我认为这不是好的代码。不幸的是,我无法在每 100 个文件中创建一个新行。

echo "START " > all.txt
cat *.txt >> all.txt
sed -i 's/)(/),(/g' all.txt
echo " END" >> all.txt

坦率地说,我需要你的帮助,因为这对我来说是一个非常复杂的代码。

我愿意接受您的宝贵意见和建议。

谢谢。

最佳答案

这里尝试使用 awk 单行(我使用 3 列以便于演示):

awk 'BEGIN{printf "START "} NR == 1 { printf "%s", $0; next} NR % 3 == 1 { printf " END\nSTART %s", $0;next}  {printf ", %s", $0} END { print " END"}' file*

$ awk 'BEGIN{printf "START "} NR == 1 { printf "%s", $0; next} NR % 3 == 1 { printf " END\nSTART %s", $0;next} {printf ", %s", $0} END { print " END"}' file*
START (10, 0), (11, 0), (12, 0) END
START (13, 0), (14, 0), (15, 0) END
START (16, 0), (17, 0), (18, 0) END
START (19, 0), (20, 0), (21, 0) END
START (22, 0), (23, 0), (24, 0) END
START (25, 0), (26, 0), (27, 0) END
START (28, 0), (29, 0), (30, 0) END
START (31, 0), (32, 0), (33, 0) END
START (34, 0), (35, 0), (36, 0) END
START (37, 0), (38, 0), (39, 0) END
START (40, 0), (41, 0), (42, 0) END
START (43, 0), (44, 0), (45, 0) END
START (46, 0), (47, 0), (48, 0) END
START (49, 0), (50, 0), (51, 0) END
START (52, 0), (53, 0), (54, 0) END
START (55, 0), (56, 0), (57, 0) END
START (58, 0), (59, 0), (60, 0) END
START (61, 0), (62, 0), (63, 0) END
START (64, 0), (65, 0), (66, 0) END
START (67, 0), (68, 0), (69, 0) END
START (70, 0), (71, 0), (72, 0) END
START (73, 0), (74, 0), (75, 0) END
START (76, 0), (77, 0), (78, 0) END
START (79, 0), (80, 0), (81, 0) END
START (82, 0), (83, 0), (84, 0) END
START (85, 0), (86, 0), (87, 0) END
START (88, 0), (89, 0), (90, 0) END
START (91, 0), (92, 0), (93, 0) END
START (94, 0), (95, 0), (96, 0) END
START (97, 0), (98, 0), (99, 0) END

或者以更易读的格式:

BEGIN { printf "START " }
NR == 1 { printf "%s", $0; next }
NR % 3 == 1 { printf " END\nSTART %s", $0; next }
{ printf ", %s", $0 }
END { print " END" }

如果你真的有一个很大的文件列表,你可能会得到 argument list too long 错误。要解决此问题,请改用 xargs

echo file* | xargs awk '......' > joined

这看起来会有同样的问题,但因为 echo 是内置于 bash 的,它不受参数长度限制的约束。

关于linux - 如何根据需要将所有文件合并为一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63945063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com