Найти и сообщить номера строк пустых строк в текстовом файле

У меня есть текстовый файл, содержащий более 14000 строк. он содержит некоторые данные, которые я использую для обучения данных распознавания речи.

Я создал этот файл с помощью кодирования Java, и из-за какой-то семантической ошибки несколько строк оказались пустыми. Каждый раз, когда я запускаю тренировку, примерно через 30 минут выдается сообщение об ошибке с пустой строкой.

Есть ли какой-нибудь код / ​​скрипт / команда, которая может дать мне список номеров строк с пустыми строками, чтобы я мог заполнить эти пустые строки и сэкономить свое время?

Работа должна быть такой:

Я введу file.txt, и это даст мне

line number 1121,1212,1450,13000 and so on ... пусто в file.txt

enter image description here

3
задан 7 August 2017 в 15:58

6 ответов

Чистый Bash, с помощью файла foo в качестве примера от ответ Zanna :

i=0
while read line; do
    ((++i))
    if [[ $line == '' ]]; then
        echo $i
    fi
done < foo

Вывод:

1
3
5
7

Или Вы могли бы предпочесть Bash, эквивалентный из решение Python с помощью enumerate():

cat -n foo | 
    while read -r i line; do
       if [[ $line == '' ]]; then
            echo $i
        fi
    done
5
ответ дан 8 August 2017 в 01:58

Используя awk

Метод для нескольких регистрирует вход (см. конец сообщения), является самым устойчивым.

Единственный файл ввел:

awk 'BEGIN { printf "Line numbers of empty lines in " ARGV[1] ": " } !NF { printf sep NR ; sep="," } END { printf "\n" }' file.txt

BEGIN разделите выполнения, прежде чем входной файл будет обработан.

ARGV[1] название входного файла. Это соответствует awk's FILENAME переменная, которая не работает в BEGIN раздел.

!NF строки соответствий, которые являются пробелом или которые только содержат разделителей полей. Разделители полей по умолчанию являются пробелами и символами табуляции, так строки, которые содержат только пробелы и количество вкладок как пустые. NF (без восклицательного знака), соответствует строкам, которые содержат данные и добавление ! инвертирует соответствие.

NR в настоящее время входной номер строки файла будучи оцененным. NR не сбрасывает к 1, если дополнительные входные файлы указаны на командной строке.

Чтобы препятствовать тому, чтобы запятая появилась перед первым числом согласующего отрезка длинной линии, оставьте строку sep неопределенный до окончания печати первого соответствия.

END раздел бежит за входным файлом, обрабатывается. В этом примере это завершает вывод чисто путем печати символа новой строки стиля Unix.

Пример произвел:

Line numbers of empty lines in file.txt: 8,13,15,20,25,28

Это немного неаккуратно для использования имени строки без первой установки его, даже если Вы первоначально хотите, чтобы это было пусто. Вы могли явно установить sep строка, чтобы быть пустым в BEGIN раздел:

awk 'BEGIN { sep="" ; printf "Line numbers of empty lines in " ARGV[1] ": " } !NF { printf sep NR ; sep="," } END { printf "\n" }' file.txt

Несколько регистрируют вход:

awk 'FNR==1 && NR>1 { printf "\n" } FNR==1 { sep="" ; printf "Line numbers of empty lines in " FILENAME ": " } !NF { printf sep FNR ; sep="," } END { printf "\n" }' file1.txt file2.txt file3.txt

FNR подобно NR, за исключением того, что FNR сбросы счетчика номера строки к 1 в начале каждого файла.

Раздел FNR==1 && NR>1 { printf "\n" } причины вывод каждого файла для печати на отдельной строке. Это печатает символ новой строки, когда первая строка каждого дополнительного входного файла обрабатывается, но не для первой строки первого файла.

Пример произвел:

Line numbers of empty lines in file1.txt: 8,13,15,20,25,28
Line numbers of empty lines in file2.txt: 1,2,4,6,7,9,10
Line numbers of empty lines in file3.txt: 3,8,9,11,13,15
6
ответ дан 8 August 2017 в 01:58

sed сообщит номер строки с = команда, таким образом, можно использовать это выражение для создания отчетов о номерах строки пустых строк (строки ни с чем между ^ (запустите строки), и $ (конец строки)):

sed -n '/^$/=' file

Мы используем -n опция подавить печать потока (номера строки печатаются отдельно от самих строк, когда мы используем =, таким образом, существует нет p управляйте здесь), таким образом, единственный вывод является номерами строки согласующих отрезков длинной линии.

$ sed -n '/^$/=' foo 
1
3
5
7

(если строки 1, 3, 5 и 7 пусты в foo)


Вот пример, чтобы показать, как можно получить взаимодействие с пользователем, которое Вы хотели. Вы могли использовать любое решение вместо sed выражение в этих структурах...

$ cat foo

2

4

6

8

Так:

$ read -p "Enter file name: "; echo -e "The following lines are empty in "$REPLY":\n$(sed -n '/^$/=' "$REPLY" | tr '\n' ' ')"
Enter file name: foo
The following lines are empty in foo:
1 3 5 7 

(Используйте tr '\n' ',' получить запятые вместо пробелов)

Вы могли сохранить как сценарий (я называю мой empline):

#!/bin/bash
read -p "Enter file name: "
echo -e "The following lines are empty in "$REPLY":\n\
$(sed -n '/^$/=' "$REPLY" | tr '\n' ' ')"

Сделайте исполняемый файл сценария:

chmod u+x empline

Затем можно выполнить его как это

$ ./empline
Enter file name: foo
The following lines are empty in foo:
1 3 5 7 

Вы могли пропустить read строка и замена "$REPLY" с "$1" использовать имя файла в качестве позиционного параметра (таким образом выполненный ./empline foo). Для упрощения использования Вы могли сделать функцию и добавить в конец Вашего ~/.bashrc:

function empline() {
    echo -e "The following lines are empty in "$1":\n\
$(sed -n '/^$/=' "$1" | tr '\n' ' ')"
}

Это берет имя файла в качестве аргумента:

$ empline foo
The following lines are empty in foo:
1 3 5 7 
6
ответ дан 8 August 2017 в 01:58

Можно найти пустые строки и их номера строки, с

grep -E --line-number --with-filename '^ 

пример:

w3@aardvark:~(0)$ grep -E --line-number --with-filename '^ 

, Если Ваши "пустые" строки содержат пробелы или ВКЛАДКИ, используйте:

grep -E --line-number --with-filename '^\s* file.txt
file.txt file.txt:1: file.txt:3: file.txt:4: w3@aardvark:~(0)$ cat -n file.txt 1 2 Not empty 3 4 5 Not empty w3@aardvark:~(0)$

, Если Ваши "пустые" строки содержат пробелы или ВКЛАДКИ, используйте:

grep -E --line-number --with-filename '^\s* file.txt
file.txt

пример:

w3@aardvark:~(0)$ grep -E --line-number --with-filename '^ 

, Если Ваши "пустые" строки содержат пробелы или ВКЛАДКИ, используйте:

grep -E --line-number --with-filename '^\s* file.txt
file.txt file.txt:1: file.txt:3: file.txt:4: w3@aardvark:~(0)$ cat -n file.txt 1 2 Not empty 3 4 5 Not empty w3@aardvark:~(0)$

, Если Ваши "пустые" строки содержат пробелы или ВКЛАДКИ, используйте:

grep -E --line-number --with-filename '^\s* file.txt
11
ответ дан 8 August 2017 в 01:58

Для единственного выполненного файла:

$ printf "line numbers %s are empty in your file.\n"\
 "$(grep --line-number '^ 

, Который выводы:

line numbers 2, 5, 7, 9, 10,  are empty in your file.
file-name | tr ':\n' ', ')"

, Который выводы:

line numbers 2, 5, 7, 9, 10,  are empty in your file.
2
ответ дан 8 August 2017 в 01:58

perl :

Печать (printf("%s\n", $.)) номер строки, если это пусто (if /^$/):

perl -ne 'printf("%s\n", $.) if /^$/' file.txt
<час>

python3:

Итерация по перечислимому (start == 1) строки файла и печать номера строки, когда пустой:

with open('file.txt') as f:
    for idx, line in enumerate(f, 1):
        if line.rstrip('\n') == "":
            print(idx)
3
ответ дан 8 August 2017 в 01:58

Другие вопросы по тегам:

Похожие вопросы: