Как распечатать таблицу из нескольких файлов

Если вы используете GNU sed (, иногда называемую gsed), то длинные строки допустимы вплоть до предела памяти.

Если вы используете другой sed, например MacOS или BSD, будут ограничения. Руководство GNU sed объясняет:

For those who want to write portable sed scripts, be aware that some implementations have been known to limit line lengths (for the pattern and hold spaces) to be no more than 4000 bytes. The POSIX standard specifies that conforming sed implementations shall support at least 8192 byte line lengths. GNU sed has no built-in limit on line length; as long as it can malloc() more (virtual) memory, you can feed or construct lines as long as you like.

Таким образом, если у вас есть GNU sed, вы можете использовать решение sed, предложенное @philippos:

sed 's/\.\.\. [0-9]* more items//g'

Использование awk

В качестве альтернативы, если у вас есть GNU awk (, иногда называемый gawk), попробуйте:

awk -v RS='\.\.\. [0-9]* more items' 1 ORS="" File

Таким образом, регулярное выражение \.\.\. [0-9]* more itemsиспользуется в качестве разделителя записей на входе и пустая строка в качестве разделителя записей на выходе. Это приводит к удалению любого совпадения регулярного выражения \.\.\. [0-9]* more items.

Поскольку awk считывает только одну запись за раз, это будет потреблять меньше памяти, чем решение sed.

-1
12.01.2021, 10:11
2 ответа

Если вы перейдете в каталог, следующее должно вывести первые 55 строк в каждом файле в этом каталоге. Это, в свою очередь, может быть отсортировано / передано в файл и т. д. Есть более удобные способы сделать это, но это должно работать.

ls -al | awk '{print $9 }' | while read line; do cat $line | head -55 ; done

Обратите внимание: если команда ничего не выводит, вам может потребоваться изменить столбец в команде «awk» на столбец, подходящий для вашей ОС.

-2
18.03.2021, 22:38

На ум приходит awkрешение:

awk '$1~/^[[:digit:]]+$/ && $1>=1 && $1<=55' *.txt

Это обработает все файлы, оканчивающиеся на.txt(или любые другие имена файлов в вашем случае ), и проверит первый столбец каждой строки. Он напечатает строку при условии, что первый столбец

  • — целое число, а
  • его значение находится в диапазоне от 1 до 55 (включительно)

Таким образом, мы можем быть уверены, что обработка ограничивается фактическим «телом файла», игнорируя «заголовок таблицы».

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

$1~/^[[:digit:]]$/

-

$1+0==$1

, как отметил @αғsнιη в комментарии.

1
18.03.2021, 22:38

Теги

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