У меня есть текстовый файл, содержащий более 14000 строк. он содержит некоторые данные, которые я использую для обучения данных распознавания речи.
Я создал этот файл с помощью кодирования Java, и из-за какой-то семантической ошибки несколько строк оказались пустыми. Каждый раз, когда я запускаю тренировку, примерно через 30 минут выдается сообщение об ошибке с пустой строкой.
Есть ли какой-нибудь код / скрипт / команда, которая может дать мне список номеров строк с пустыми строками, чтобы я мог заполнить эти пустые строки и сэкономить свое время?
Работа должна быть такой:
Я введу file.txt
, и это даст мне
line number 1121,1212,1450,13000 and so on ...
пусто в file.txt
Чистый 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
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
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
Можно найти пустые строки и их номера строки, с
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
Для единственного выполненного файла:
$ 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.
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)