如果第二行为空则打印文件名

Print name of file if second line is empty

文件如下所示:

>5BW0 B
CHHHHHHHHHHHHHHHHHHHHHHHCCCCCCEEEEEEEEEECCEEEEEEEEEEECCCCCCEEEEEEEEECCCCCCCHHHHCCEEEEEEEC

但是第二行可以为空。

我正在尝试查找第二行为空的文件。

到目前为止,我是在 for 循环中想到的:

cat file1 | sed -n '2p' | grep '^$'

问题是我没有保存文件名以便以后打印。 我该如何解决这个问题?

如何遍历文件名并查看第二行是否为空,如下所示。 ;2q 部分在第 2 行后退出 sed 以避免无意义地读取其余可能许多 gigalines 的数据。

for file in file1 file2; do
  if test -z "$(sed -n "2p;2q" "$file")"; then
     echo "2nd line of $file is empty"
  fi
done

您还可以将文件名列表传送到循环中:

find . -name '*.txt' |
while read -r file; do
  if test -z "$(sed -n "2p;2q" "$file")"; then
    echo "2nd line of $file is empty"
  fi
done

使用单个 GNU awk 您可以尝试以下 awk 程序。用 GNU awk 编写和测试。我在这个程序中传递了 2 Input_files 命名为 file1 和 file2 你也可以根据你的要求传递文件数。

awk 'FNR==3{nextfile} FNR==2 && !NF{print FILENAME;nextfile}' file1 file2

OR 根据以上 Ed 先生的建议可以缩短为:

awk 'FNR==2{ if (!NF) print FILENAME; nextfile }' file1 file2

解释: 简单地检查文件的第 3 行是否移动到下一个文件(这意味着第 2 行不为空).然后再检查 2 个条件,如果行是第二行且为空,则打印文件名并移至下一个文件。

注意: 如果您需要查找第 2 行为空的文件并打印其名称,请在上面进行此操作代码作为 script.awk 代码并将其传递给 find 命令中的 运行。

这可能适合您 (GNU sed):

sed -n '2{/\S/!F}' file

如果文件的第二行不包含非空白字符,则输出文件名。

或者您可能更喜欢:

sed '2!d;/^$/F;d' file