【问题标题】:Concatenating 500 files while removing the first line from each file except the first file连接 500 个文件,同时从除第一个文件之外的每个文件中删除第一行
【发布时间】:2014-10-21 09:36:44
【问题描述】:
我想创建一个文件,它是 500 个文件的串联结果,其中除第一个文件之外的每个文件的第一行都被删除。我也希望原始文件保持不变。
我知道 cat 和 sed 应该通过管道传输,但我无法完全理解它!
目前我能想到的如下:
-
备份原始文件。
-
使用以下方法从每个文件中删除标题:
for x in *.seg; do sed -i 1d ${x}; done
-
使用cat连接文件
-
将标题添加到第 3 步的结果中。
您能否提出一个可以在保持原始文件完整的同时做到这一点的管道?
【问题讨论】:
标签:
linux
bash
sed
scripting
cat
【解决方案1】:
您可以使用 awk 来执行此操作:
awk 'NR == FNR || FNR > 1' *.seg > destination
对于第一个文件,总记录数 NR 将等于当前文件的记录数 FNR,因此将打印所有行。对于其他文件,仅打印第一个文件之后的行。输出重定向到文件destination。
由于您有 500 个文件,FNR > 1 将比 NR == FNR 更频繁地评估为 true,因此您可能需要切换顺序以便发生短路:
awk 'FNR > 1 || NR == FNR' *.seg > destination
当|| 的第一部分为真时,不需要评估第二部分。快得多;)