Дополнительное пространство с подсчитанным номером строки?

Awk может использовать любой символ в качестве разделителя записей (с новой строкой как значение по умолчанию), за исключением того, что некоторые реализации не поддерживают пустой байт как разделитель. Простофиля (GNU awk), значение по умолчанию awk на самых невстроенных установках Linux, поддержки аннулируют.

gawk -v RS='\0' -v ORS='\0' 'NR <= 2 {print}'

Это может быть сокращено к gawk -v RS='\0' -v ORS='\0' 'NR <= 2' начиная с печати записи действие по умолчанию.

Для большого файла необходимо выйти после второй строки.

gawk -v RS='\0' -v ORS='\0' 'NR==3 {exit} {print}'

С другой стороны, можно использовать head. Нет никакой опции использовать пустой байт вместо новой строки как разделитель записей, но можно подкачать эти два символа, звонить head, и затем подкачка назад.

tr '\0\n' '\n\0' | head -n 2 | tr '\0\n' '\n\0'
3
28.05.2015, 01:50
4 ответа

Как определено POSIX, вывод wc должен содержать запись для каждого входного файла формы:

"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>

Но формат выходного файла псевдо printf() строки отличается от System V версии wc:

"%7d%7d%7d %s\n"

POSIX не требовал добавления лидирующих пробелов, поэтому он свободен для реализации, чтобы делать то, что он хочет. Существуют различные реализации wc, по крайней мере, с OSX и wc из сундука с реликвиями, он добавил лидирующие пробелы для вывода.

$ /usr/5bin/wc -l /tmp/file
      3  /tmp/file

GNU wc также добавляют лидирующие пробелы при чтении из стандартной оболочки внутри и без опций:

$ cat file | wc
  5       5      65

Чтобы удалить все лидирующие пробелы, в оболочке POSIX:

set -f
set -- $nl
nl=$1
set +f

Обратите внимание, что этот подход предполагает, что переменная содержит только лидирующие или скользящие пробелы, никаких пробелов посередине, как a b.

4
27.01.2020, 21:09

wc могут создавать лидирующие пробелы; это также может зависеть от того, используются ли (и сколько) опций (GNU wc, например, не будет создавать пробелов, если, как в вашем случае, используется ровно одна опция). Эти пробелы сохраняются в присваивании nl=$(...). Чтобы удалить пробелы, в качестве обходного пути, вы можете использовать любой из них:

nl=$(wc -l < ~/myfile.txt | awk '{print $1}')

или

nl=$(awk 'END{print NR}' ~/myfile.txt)

или

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=$(echo $nl)

или (но см. ниже комментарий @cuonglm для heirloom версии wc)

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=${nl##* }
4
27.01.2020, 21:09

В качестве альтернативы без проблем с пробелами (POSIX):

$ sed -n '$=' ~/myfile.txt

Захвачено в переменной:

$ nl=$(sed -n '$=' ~/myfile.txt)
$ echo "1-$nl-"
1-100-

Обратите внимание, что sed считает последнюю строку, даже если она не заканчивается символом новой строки (, как это должно быть в правильно отформатированном текстовом файле ). В более общем случае sed может не напечатать количество символов новой строки в текстовых файлах, отличных от -.


Другой вариант:

$ nl=$(grep -v. ~/myfile.txt | tr '\n' 'x')
$ echo "1-${#nl}"
1-100

Обратите внимание, что grep также будет печатать недопустимые символы (в дополнение к символам новой строки )в используемой локали.

1
27.01.2020, 21:09

Самый простой обходной путь (в bash или любой другой оболочке POSIX):

nl=$(wc -l < ~/myfile.txt)
nl=$(($nl))

$((...))в стандарте shдля арифметического расширения,поэтому результатом всегда будет только само число. Обратите внимание, что если wc -lне выводит ничего (, например, когда файл не может быть прочитан ), это даст 0вместо пустой строки.

$((nl))также будет работать в bash, но POSIX не гарантирует, что $nlне содержит числовой константы и на практике не работает, например, в yash.

Вы также можете сделать все сразу с помощью:

nl=$(($(wc -l < ~/myfile.txt)))

Преимущество этого заключается в сохранении статуса выхода wc.

2
27.01.2020, 21:09

Теги

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