这里尝试使用 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,所以它不受参数长度限制的约束。