Copying first lines of multiple text files into single file
使用单个bash命令(允许使用管道,stdio)
将每个名称以ABC开头的文件的第一行复制到名为DEF的文件。
示例:
输入:
ABC0:
ABC1:
ABC2:
结果:
DEF:
已经尝试过cat ABC* | head -n1,但是它仅占用第一个文件的第一行,其余的省略。
- Using single bash command (pipes, stdio allowed) copy first line of each file whose name begins with ABC to file named DEF.-这是家庭作业,对不对?
-
看起来确实像家庭作业
您可能希望head -n1 ABC*让head占据每个文件的第一行。从标准输入读取,head对其输入来自何处一无所知。
但是,
head添加了自己的标头以标识每行来自哪个文件,因此请使用awk:
1
| awk 'FNR == 1 {print}' ./ABC* > DEF |
FNR是包含输入当前行的行号的变量,每次打开新文件时将其重置为0。使用./ABC*而不是ABC*可以防止包含=的文件名(如果=之前的部分是有效的awk变量名称,则awk会进行特殊处理。)HT William Pursell。)
- 请注意,这将对名称中包含=的文件造成麻烦。
-
或awk 'FNR == 1 {print; nextfile}' ABC*避免每个文件处理多于1行。
-
nextfile不是标准的,但是如果可用的话很好使用。我试图考虑对包含=的文件名进行更好的修复,而不是分别在每个文件上运行head -n1。
-
" nextfile多年来一直是常见的扩展。2012年9月,它被接受并包含在POSIX标准中。请参阅Austin Group网站" –来自GNU Awk用户指南
-
嘿。知道何时实际发布POSIX的下一版本吗? :)但正如链接所述,大多数主要版本都支持它。
-
没有时间的猜测,您的比我的:)好。我只是很高兴得知它实际上已包含在内。
-
awk 'FNR == 1' ./ABC*解决了名称中=的问题。
假定文件名不包含空格或换行符,并且不存在名称以ABC:
开头的目录
1
| ls ABC* | xargs -n 1 head -n 1 |
-n 1确保head一次仅接收一个名称。
如果不满足上述条件,请使用建议的循环,如chepner,但要明确防止不是纯文件的目录条目,以避免head发出错误消息。
-
基本上不,这就是为什么我说了这项工作的前提条件;这就是为什么。但是替代方法是改为使用echo ABC*|fmt -w 1,这不会更好。
-
不,替代方案是不要首先使用xargs。
-
@chepner:如果您确定知道文件名的外观,则可以选择我的解决方案。这就是为什么我将警告放在我的答案中的原因,它明确表示如果不满足先决条件,则需要使用循环。当然,如果前提条件不成立,那就是在编程中总是乱码,乱码。