如何将所有文件合并为一个文件,如我所愿
How to combine all files into one file, as I want
一个文件夹中有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
坦率地说,我需要你的帮助,因为这对我来说是一个非常复杂的代码。
欢迎您提出宝贵的意见和建议。
谢谢。
我知道你在 shell 中要求它 - 但从技术上讲,如果你在 Python 解决方案前加上 python -c "
,它就是 shell,不是吗? [眨眼]
#! /usr/bin/env python3
import os
contents = []
with ('all.txt', 'wt') as output:
for filename in os.listdir('.'):
if filename == 'all.txt': continue
contents.append(open(filename).read().strip())
if len(contents) >= 100:
output.write(f'''START {', '.join(contents)} END\n''')
contents = []
output.write(f'''START {', '.join(contents)} END\n''')
此处尝试使用 awk one-liner(我使用 3 列以便于演示):
awk 'BEGIN{printf "START "} NR == 1 { printf "%s", [=10=]; next} NR % 3 == 1 { printf " END\nSTART %s", [=10=];next} {printf ", %s", [=10=]} END { print " END"}' file*
$ awk 'BEGIN{printf "START "} NR == 1 { printf "%s", [=10=]; next} NR % 3 == 1 { printf " END\nSTART %s", [=10=];next} {printf ", %s", [=10=]} 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", [=11=]; next }
NR % 3 == 1 { printf " END\nSTART %s", [=11=]; next }
{ printf ", %s", [=11=] }
END { print " END" }
如果文件列表确实很大,可能会出现 argument list too long
错误。要解决此问题,请改用 xargs
。
echo file* | xargs awk '......' > joined
这看起来会有同样的问题,但因为 echo
是 bash
的内置函数,所以它不受参数长度限制的约束。
像这样(未经测试)应该这样做:
awk '
{ rec = (rec=="" ? "" : rec ", ") [=10=] }
(NR%100) == 0 {
print "START", rec, "END"
rec = ""
}
' *
Bash 变体
n=1; while read -r line; do
((n==1)) && printf 'start '
printf "$line"
((n>=10)) && { printf ' end\n'; n=1 ; } \
|| { printf ', ' ; ((n++)); }
done < <(cat file*)
一个文件夹中有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
坦率地说,我需要你的帮助,因为这对我来说是一个非常复杂的代码。
欢迎您提出宝贵的意见和建议。
谢谢。
我知道你在 shell 中要求它 - 但从技术上讲,如果你在 Python 解决方案前加上 python -c "
,它就是 shell,不是吗? [眨眼]
#! /usr/bin/env python3
import os
contents = []
with ('all.txt', 'wt') as output:
for filename in os.listdir('.'):
if filename == 'all.txt': continue
contents.append(open(filename).read().strip())
if len(contents) >= 100:
output.write(f'''START {', '.join(contents)} END\n''')
contents = []
output.write(f'''START {', '.join(contents)} END\n''')
此处尝试使用 awk one-liner(我使用 3 列以便于演示):
awk 'BEGIN{printf "START "} NR == 1 { printf "%s", [=10=]; next} NR % 3 == 1 { printf " END\nSTART %s", [=10=];next} {printf ", %s", [=10=]} END { print " END"}' file*
$ awk 'BEGIN{printf "START "} NR == 1 { printf "%s", [=10=]; next} NR % 3 == 1 { printf " END\nSTART %s", [=10=];next} {printf ", %s", [=10=]} 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", [=11=]; next }
NR % 3 == 1 { printf " END\nSTART %s", [=11=]; next }
{ printf ", %s", [=11=] }
END { print " END" }
如果文件列表确实很大,可能会出现 argument list too long
错误。要解决此问题,请改用 xargs
。
echo file* | xargs awk '......' > joined
这看起来会有同样的问题,但因为 echo
是 bash
的内置函数,所以它不受参数长度限制的约束。
像这样(未经测试)应该这样做:
awk '
{ rec = (rec=="" ? "" : rec ", ") [=10=] }
(NR%100) == 0 {
print "START", rec, "END"
rec = ""
}
' *
Bash 变体
n=1; while read -r line; do
((n==1)) && printf 'start '
printf "$line"
((n>=10)) && { printf ' end\n'; n=1 ; } \
|| { printf ', ' ; ((n++)); }
done < <(cat file*)