Как проверить, завершен ли файл и достигли ли вы EOF? - PullRequest
0 голосов
/ 01 марта 2019

Мой соавтор обрабатывал большой пакет файлов, но некоторые из выходных файлов, кажется, прерваны до их завершения.Кажется, что эти неполные файлы не имеют символа конца файла (EOF).Я хотел бы сделать скрипт в пакетном режиме, чтобы пройти через все эти файлы и проверить, есть ли символ EOF для каждого из ~ 500 файлов.Можете ли вы дать мне представление о том, как это сделать?Какую команду я могу использовать, чтобы узнать, имеет ли файл символ 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 эти прерванные файлы, они выглядят так:

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?

Извините, если вопрос немного сбивает с толку,

ура, Гильермо

1 Ответ

0 голосов
/ 01 марта 2019

Да, разница в том, что в первом случае файл заканчивается на \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.Таким образом, в этом примере символ новой строки 0x0a (номер 10) на карте ASCII.

Если вы хотите узнать последний символ каждого файла, вы можете сделать следующее:

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;

Если вы хотите узнать, какие файлы заканчиваются символом, который не является новой строкой, вы можетеделать:

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;
...