如何从目录中的每个文件中选择第一行并将其打印到新的文本文件中


13

我有一个包含多个.txt文件的目录。

我要从每个文件中选择第一行并将其打印到新.txt文件中(以获取所有第一行的列表)。

我尝试了awksed命令,并将其与循环结合使用,但是没有成功。


1
由于您是6级用户:如果以下任何答案都对您有所帮助,请不要忘记单击其文本左侧的灰色,这表示是的,此答案有效;-)
Fabby 2015年

Answers:


21

用途head

head -n1 -q *.txt > new-file
  • -n1告诉head仅提取第一行。
  • -q 告诉头不要打印文件名。

9

使用grep

grep -m 1 '.' *.txt >output.file

grep将匹配任何字符,并在第一个匹配项后退出,即grep输出所有输入文件的第一行,并将它们保存在中out.txt


1
我喜欢这个,这是一个不错的小技巧。
Hashim

2

仅使用Bash:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txt扩展到.txt当前工作目录中以/结尾的文件夹/文件的列表(因为只.txt关心以/结尾的文件);
  • <"$f" read line从存储在文件路径中读取一行f并将其存储在其中line
  • printf "$line\n" >>new.txt:追加的内容linenew.txt;
% cat foo.txt 
line #1 in foo
line #2 in foo
line #3 in foo

% cat bar.txt
line #1 in bar
line #2 in bar
line #3 in bar

% for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done

% cat new.txt 
line #1 in bar
line #1 in foo

科斯,有点长,但这里是+1 ..
heemayl

@heemayl但这只是Bash。;)
kos 2015年

1
BTW
恭喜

1
@heemayl谢谢:D。老实说,为了保护问题XD,我正在疯狂地检查网站
kos 2015年

0

您已尝试使用awk,这是一个awk版本

awk 'FNR==1 {print} {nextfile}' *.txt > out

0

使用AWK的另一种方法是告诉AWK打印,然后立即转到下一个文件

tmp:$ touch file1 file2 file3

tmp:$ printf  "Line 1 \n Line 2" | tee file1 file2 file3
Line 1 
 Line 2
tmp:$ awk '{print;nextfile}' file1 file2 file3
Line 1 
Line 1 
Line 1

sed还可以打印特定的行。在这里,我将其与find

tmp:$ find . -name "file*" -exec  sed -n '1p' {} \;                            
Line 1 
Line 1 
Line 1 

和perl:

tmp:$ find . -name "file*"  -exec perl -ne 'print  if 1..1' {} \;              
Line 1 
Line 1 
Line 1 

最后但并非最不重要 , grep

tmp:$ grep -n 1 file1 file2 file3                                              
file1:1:Line 1 
file2:1:Line 1 
file3:1:Line 1 

将所有内容保存到单个文件仅是> outputFile.txt在这些命令末尾附加的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.