Как удалить определенные ключи из списка слов?

Длинный путь вокруг. Но ради удовольствия:

1. Создайте временное изображение:

    $ truncate -s64MiB tmp.img

2. Создайте два использования разделов fdisk:

Скорее подробный, но хорошо.

$ fdisk tmp.img

Первый раздел:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>

Второй раздел:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)

Печать, что мы собираемся записать:

: x
: p
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 00  32  33    0  57  52    5       2048      81920 83
 2 00  57  53    5  40  32    8      83968      47104 83

Запись и выход:

:w (Dont! forget ;-) )

У нас есть два раздела 40 и 23 мебибайт:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB

3. Создайте две файловых системы:

truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img

4. Сшейте все это вместе:

Извлечение сначала 2048*512 байты из временного изображения:

dd if=tmp.img of=disk.img bs=512 count=2048

Объедините их:

cat ext4.img ext3.img >> disk.img

Отлично.

3
20.11.2014, 10:01
2 ответа

Если слова расположены в каждой строке, то можно использовать awk,

awk '$0 >= 03509999999 && $0 <= 03999999999 {next;}{print}' file
0
27.01.2020, 21:27

Я использовал драйвер для < 3.4 ядра и у меня есть 3.13. Я скачал новый драйвер. Я видел «3.1.3»...

-121--89385-

Как уже говорили другие, ваши если тест...; fi синтаксически неверны, но также стоит отметить, что весь ваш подход немного грубый. Есть пара областей, в которых поток этого сценария может быть резко улучшен - в частности, в том, что его будет легче читать и редактировать позже.

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

set --
for c in \
    "Base install:base_fn"                             \
    "Mintrepos:mint_fn"                                \
    "Asusn13 driver:asus_fn"                           \
    "Install Standard openbox:std_obox_fn"             \
    "Install Xfceopenbox:xfce_obox_fn"                 \
    "backing up standard open box config:bkup_fn obox" \
    "backing up openboxfce:bkup_fn xfce"              
do
    set -- "$@" "${c##*:}"
    printf "'%s' = $#\n" "${c%:*}"
done

Это кодирует вызываемое fn _ name в массив позиционных параметров, одновременно печатая понятное пользователю описание stdout.

После создания списка выбранных элементов в «$ @» и печати хода выполнения, можно прочитать выбранные пользователем элементы в небольшом цикле, который будет закрыт после слишком большого количества неудачных попыток, а также проверить их ввод:

chk=$((($#<1)*5))                           #if not at least one choice quit
until [ "$((chk+=1))" -gt 5 ] && exit 1     #chks up to 5 times or quits
printf '\nSelect: '                         #prompts for each try
read -r c && [ -n "${c##*[!0-9]*}" ]        #fails if input not number or empty
do echo "Invalid selection."; done          #prints a notice and retries

В последний раз можно просто сдвинуть все ненужные параметры и вызвать $1 :

shift "$((c-1))"; $1

Лучше проверить, нет ли начальных нулей. shift приведет к ошибке, если пользователь выбрал слишком большое число.

[ "$((c=$(printf %.d "$c")))" -gt 0 ] || exit 
shift "$((c-1))" && $1

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

case "$choice" in
(pattern 1)  do as necessary for a match;;
(pattern 2)  do otherwise for this match;;
(pattern 3)  continue this wise for each;;
(*)          until there isn't a match  ;;
esac 

Это только переносимые средства эмуляции того, что многие оболочки (включая bash ) предложат в качестве оператора select , введенного ksh много лет назад.

Из man bash :

  • выберите name [ в word ]; сделать список ; done
    • Список слов, следующий в, расширяется, создавая список предметов. Набор развернутых слов печатается на стандартную ошибку, каждой из которых предшествует число. Если в слове опущен, то печатаются позиционные параметры (или «$ @» ) (см. ПАРАМЕТРЫ ниже). Появится подсказка $ PS3 и строка, считанная из стандартного ввода.
-121--105558-

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

head --lines 509999999 input_file

Если файл выглядит следующим образом:

03000000000 03509999998 03509999999 03510000000 03999999998
03000000001 03999999999 03000000002

(т. е. несортированные и несколько записей в строке) можно использовать следующий питон программа:

import sys

def read(fp):
    buf = ""
    while True:
        if ' ' in buf or '\n' in buf:
            try:
                word, buf = buf.split(None, 1)
            except ValueError:
                word, buf = buf.strip(), ""
            if word:
                yield word
        if not buf:
            buf = fp.read(100)
        if not buf:
            yield None

with open(sys.argv[1]) as fp:
    for x in read(fp):
       if x is None:
           break
       if sys.argv[2] <= x <= sys.argv[3]:
           continue
       print x

начать с python test.py inputfile 03509999999 03999999999 . На выходе будут слова в том же порядке, что и в оригинале, но все они будут разделены новой строкой.

2
27.01.2020, 21:27

Теги

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