Если файлы уже отсортированы приемлемым образом, вы можете объединить -отсортировать их, а затем uniq
их:
sort -t_ -k2,2n -k3,3n -m -- *.txt | uniq > Unique_Position.txt
... который сортирует числовое значение по второму полю (с разделителями символами подчеркивания_
)и, если эти ключи уникальны, по третьему полю. Результирующий вывод затем направляется через uniq
перед перенаправлением в выходной файл.
С учетом (короткого )примера входных данных, приведенного выше, результаты:
chr1_1_200
chr1_200_400
chr1_600_800
chr1_1000_1200
Если вы можете полностью указать поля сортировки для строк, которые вы хотите сохранить,вы можете сделать все это в sort
, добавив опцию -u
:
sort -t_ -k1 -k2,2n -k3,3n -m -u *.txt > Unique_Position.txt
Это позволит сохранить уникальные строки среди трех перечисленных полей без необходимости вызыватьuniq
(уведомление о добавлении опции -u
). Эти поля сортировки должны соответствовать способу сортировки входных файлов.
В mkfs.ext4
нет опции, говорящей о прекращении работы в случае обнаружения файловой системы. Вместо этого вам нужно выполнить эту проверку самостоятельно. (Я полагаю, что mkfs.ext4
запрашивает подтверждение только в том случае, если стандартный ввод подключен к терминалу, а если нет, то он предполагает, что не получит ответа, поэтому все равно продолжает. Это был бы разумный подход, аналогичный ls
и ls | cat
для вывода разных макетов.)
Вот примеры запросов файловой системы устройства на Pi,
file -s /dev/mmcblk0p1
/dev/mmcblk0p1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 16, root entries 512, Media descriptor 0xf8, sectors/FAT 32, sectors/track 63, heads 255, sectors 129024 (volumes > 32 MB), reserved 0x1, serial number 0x22e0c711, label: "boot ", FAT (16 bit)
file -s /dev/mmcblk0p2
/dev/mmcblk0p2: Linux rev 1.0 ext4 filesystem data, UUID=202638e1-4ce4-45df-9a00-ad725c2537bb (needs journal recovery) (extents) (large files)
file -s /dev/mmcblk0p3
/dev/mmcblk0p3: LVM2 PV (Linux Logical Volume Manager), UUID: 40t385-3Q2C-u3Qz-TN5b-1fI1-0oYC-PsMQ3c, size: 27618967552
Существует довольно много возможных вариантов -значительно больше, чем я показал здесь -, поэтому, вероятно, проще искать «пустой» случай и продолжать только в том случае, если предполагаемое устройство соответствует этому. Для эксперимента вы можете использовать dd if=/dev/zero
или dd if=/dev/urandom
, но оба имеют file -s
возврат data
в качестве типа файла :
dd if=/dev/zero bs=1M count=100 of=/tmp/100M.dat
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.487274 s, 215 MB/s
lodev=$(losetup --find --show /tmp/100M.dat ); echo $lodev
/dev/loop0
file -s $lodev
/dev/loop0: data
losetup -d $lodev
rm /tmp/100M.dat
Код может быть примерно таким:
#!/bin/sh
device=/dev/xvdf
magic=$(file -s "$device" 2>&1)
if [ "$magic" = "$device: data" ]
then
# It isn't an obvious filesystem
mkfs.ext4... "$device"
else
# Uh oh
printf "%s\n" "Cowardly refusing to create a filesystem on ${magic%%,*}" >&2
exit 1
fi