如何检查文件是否已完成并达到EOF?

问题描述 投票:0回答:1

我的协作者正在处理大量文件,但是一些输出文件在完成之前似乎被中断了。似乎这些不完整的文件没有文件字符(EOF)的结尾。我想批量编写一个脚本来循环遍历所有这些文件,并检查每个~500个文件中是否有EOF字符。你能告诉我怎么做的吗?我可以使用哪个命令来确定文件末尾是否有EOF字符?

我不确定文件末尾是否应该有特殊字符,但正常文件看起来像这样

my_user$ tail CHSA0011.fastq
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@HS40_15367:8:1106:6878:29640/2
TGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGACCCTGAAGTAGGAACCAGA
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@HS40_15367:8:1202:14585:48098/1
TGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGACCCTGAAGTAGGAACCAGA
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
my_user$

但当我做tail tho thse thinter files他们看起来像:

my_user$ tail IST-MES1.fastq
@HS19_13305:3:1115:13001:3380/2
GTGGAGACGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAGCTCCTGACCTCAAGTGATCCGTCTGCCTTGGCC
+
@B@FFFFFHHHHFHHIJJJJJIIJJJJJJJIJJJJGIIJJGIIGIIJJJJFDHHIJFHGIGHIHHHFFFFFFEEE
@HS19_13305:3:1106:5551:75750/2
CGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAGCTCCTGACCTCAAGTGATCCGTCTGCCTTGGCCCCCCAAA
+
CCCFFADFHHHHHJJIJJJJJJJJJJJJEGGIJGGHIIJIIIIIIJJJJDEGGIJJJGIIIJJIJJJHHHFDDDD
@HS19_13305:3:2110:17731:73616/2
CGAGGTTTCACCATGTTGGCCAGGCTGmy_user$

如您所见,在普通文件中,my_user $显示在文件末尾下方一行。但是在这些被中断的那些中,my_user $紧挨着文件的末尾。也许只是因为文件不以断路器\n结束?

如果这个问题有点令人困惑,我很抱歉

欢呼,吉列尔莫

bash unix terminal eof
1个回答
1
投票

是的,不同之处在于,在第一种情况下,文件以\n(新行)结尾。

BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
my_user$

在这种情况下,它没有新行,所以它打印的下一件事是你的使用(实际上是你的PS1

CGAGGTTTCACCATGTTGGCCAGGCTGmy_user$

你可以试试这个:

echo "CCCFFADFHHHHH"      # <--- implicitly includes newline at the end

echo -n "CCCFFADFHHHHH"   # <--- does not include newline at the end

实际上有两个终端选项,\r\n,根据您的操作系统有不同的标准。我假设您正在使用linux并且仅使用\n。因此,在此示例中,换行符是ascii映射中的0x0a(数字10)。

如果你想知道每个文件的最后一个字符,你可以这样做:

echo -n "CCCFFADFHHHHH" > uglyfile.txt
echo  "CCCFFADFHHHHH" > nicefile.txt
for file in *.txt; do 
    echo -n "$file ends with: 0x"; 
    tail -c 1 $file | xxd -p;
done;

如果您想知道哪些文件以不是换行符的char结尾,您可以执行以下操作:

echo -n "CCCFFADFHHHHH" > uglyfile.txt
echo  "CCCFFADFHHHHH" > nicefile.txt
for file in *.txt; do 
    lastchar_hex=`tail -c 1 $file | xxd -p`
    if [[ $lastchar_hex != '0a' ]]; then
      echo "File $file does not end with newline"
    fi;
done;
© www.soinside.com 2019 - 2024. All rights reserved.