如何读取文件的第N行并将其打印到新文件?

cap*_*ain 16 unix bash shell

我有一个名为foo的文件夹.Foo有一些其他文件夹,可能有子文件夹和文本文件.我想找到以名称年份开头的每个文件并读取其第N行并将其打印到新文件.例如,foo有一个名为year1的文件,子文件夹中有文件名为year2,year3等.程序会将year1的第一行打印到一个名为writeout的文件中,然后将第二行打印到文件写入等.

我也不太懂得如何为文件执行for循环.

到目前为止,我有:

#!/bin/bash

for year* in ~/foo
do
  Here I tried writing some code using the sed command but I can't think of something       else.
done
Run Code Online (Sandbox Code Playgroud)

我还在终端收到一条消息,说"年*"不是有效的标识符.有任何想法吗?

she*_*ter 35

Sed可以帮到你.

回想一下,sed通常会处理文件中的所有行并打印文件中的每一行.

您可以关闭该功能,并通过匹配模式或行号仅选择感兴趣的打印行.

因此,要打印文件2的第2行,您可以说

sed -n '2p' file2 > newFile2
Run Code Online (Sandbox Code Playgroud)

要打印第二行然后停止处理,请添加q(用于退出)命令(还需要大括号将两个命令组合在一起),即

sed -n '2{p;q;}' file2 > newFile2
Run Code Online (Sandbox Code Playgroud)

(如果您正在处理大文件,这可以节省很多时间).

为了使其更通用,您可以将数字更改为包含数字的变量,即

  lineNo=3
  sed -n "${lineNo}{p;q;}" file3 > newFile3
Run Code Online (Sandbox Code Playgroud)

如果你想让你所有的切片行进入1个文件,那么使用shell的'append-redirection',即

 for lineNo in 1 2 3 4 5 ; do
     sed -n  "${lineNo}{p;q;}" file${lineNo} >> aggregateFile
 done
Run Code Online (Sandbox Code Playgroud)

使用find ...驱动文件列表的结果的其他帖子是一种很好的方法.

我希望这有帮助.


Kar*_*ath 6

这是一种方法:

awk "NR==$YEAR" $file
Run Code Online (Sandbox Code Playgroud)