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

标签 linux bash ubuntu awk sh

一个文件夹中有 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/

相关文章:

java - 如何在 shell 脚本中运行 Picard(生物信息学)工具时消除 Java 异常错误?

linux - shell脚本将数组的值赋给变量

php - PostgreSql 'PDOException' 与消息 'could not find driver'

linux - 无法运行 Android Studio - 无效的 ReserveCodeCacheSize

android - 如何将文件传输到在 VirtualBox 中运行的 android 2.2?我安装了假SD卡

c++ - 链接器错误:对 `Reference_Genome::seq[abi:cxx11]'的 undefined reference

mysql - 为什么导入的数据库在 phpmyadmin 中较小?

linux - Nasm 中处理器寄存器的二进制表示

c - 为什么我在设置其他组ID后不调用 "read"?

php - 如何检测关闭 php 标签?