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

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

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

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

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

答案1

使用head

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

在 OS X 上(可能还有一些其他 *nix 变体),该-q选项不受支持head。您需要自行删除文件名,例如

head -n1 *.txt | grep -v '==> ' > new-file

这仅在您知道输出不应包含字符串时才有效==> 。为了绝对确定,请使用循环(这比head仅运行一次要慢得多):

for file in *.txt ; do
    head -n1 "$file"
done

答案2

使用grep

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

grep将匹配任何字符并在第一次匹配后退出,grep即将输出所有输入文件的第一行,并将这些保存在out.txt

答案3

仅使用 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.txtline:将的内容附加到new.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

答案4

使用 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将所有内容保存到单个文件只需在这些命令末尾附加即可。

相关内容