AWK, как разобраться в ряду слева направо в пределах строки?

shred работает на блочных устройствах или файлах.

Либо (если / dev / sdx - ваш внешний жесткий диск):

shred -n 1 /dev/sdx

Или, в случае файла (если размер файловой системы 2 ТиБ):

truncate -s 2T "/media/me/New Volume/shredfile"
shred -n 1 "/media/me/New Volume/shredfile"
sync
rm "/media/me/New Volume/shredfile"

Файл будет не уничтожайте весь жесткий диск, а только свободное место в файловой системе.

Параметр -n 1 гарантирует, что уничтожение будет использовать только один проход - несколько проходов - пустая трата времени.

0
22.01.2019, 20:39
2 ответа

Есть ли причина, по которой вы используете исключительно awk? Чтобы решить вашу проблему, вам нужно сначала разделить данные на каждую единицу, отсортировать, удалить дубликаты, а затем воссоединиться. Хотя вы можете сделать это с помощью любого подходящего языка программирования или сценариев (, даже C ), действительно ли стоит изобретать велосипед, когда уже есть инструменты, способные делать то, что вам нужно?

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

$ cat RAW_DATA
<ITEM ID='81'>,< 1>KWIKSET</1>,< 2>PASS</2>,< 7>KNOB</7>,< 5a>RIGHT</5a>,< 8c>BRASS</8c>,< 2>TYLO</2>,< 2>PASS</2>,< 5a>RIGHT</5a>,< 8c>BRASS</8c>
<ITEM ID='82'>,< 1>KWIKSET</1>,< 4a>PRIVACY</4a>,< 7>KNOB</7>,< 8b>SATIN</8b>,< 8c>CHROME</8c>,< 2>TYLO</2>,< 4a>PRIVACY</4a>,< 8b>SATIN</8b>,< 8c>CHROME</8c>
<ITEM ID='83'>,< 1>KWIKSET</1>,< 8b>POLISHED</8b>,< 8c>BRASS</8c>
$ while read line; do echo "$(cut -d, -f1 <<< "$line"),$(cut -d, -f2- <<< "$line" | tr ',' '\n' | sort -n | uniq | paste -sd,)"; done < RAW_DATA
<ITEM ID='81'>,< 1>KWIKSET</1>,< 2>PASS</2>,< 2>TYLO</2>,< 5a>RIGHT</5a>,< 7>KNOB</7>,< 8c>BRASS</8c>
<ITEM ID='82'>,< 1>KWIKSET</1>,< 2>TYLO</2>,< 4a>PRIVACY</4a>,< 7>KNOB</7>,< 8b>SATIN</8b>,< 8c>CHROME</8c>
<ITEM ID='83'>,< 1>KWIKSET</1>,< 8b>POLISHED</8b>,< 8c>BRASS</8c>

Цикл whileсчитывает каждую строку файла и обрабатывает ее отдельно. Затем мы хотим отобразить новую строку, где cut -d, -f1 <<< "$line"извлекает только первое поле, поскольку оно статично, а cut -d, -f2- <<< "$line" | tr ',' '\n' | sort -n | uniq | paste -sd,извлекает оставшиеся поля, сортирует их в числовом виде, фильтрует уникальные значения и использует paste -sd,для воссоединения в виде запятой -список с разделителями.

0
28.01.2020, 02:41

Я бы использовал для этого perl:

perl -MList::Util=uniq -F, -lane '
    $item = shift @F;
    @fields = uniq sort @F;
    print join ",", $item, @fields;
' file

выходы:

<ITEM ID='81'>,< 1>KWIKSET</1>,< 2>PASS</2>,< 2>TYLO</2>,< 5a>RIGHT</5a>,< 7>KNOB</7>,< 8c>BRASS</8c>
<ITEM ID='82'>,< 1>KWIKSET</1>,< 2>TYLO</2>,< 4a>PRIVACY</4a>,< 7>KNOB</7>,< 8b>SATIN</8b>,< 8c>CHROME</8c>
<ITEM ID='83'>,< 1>KWIKSET</1>,< 8b>POLISHED</8b>,< 8c>BRASS</8c>

Из него можно сделать еще более непонятный -вкладыш:

perl -MList::Util=uniq -F, -lape '$"=","; $_="@{[$F[0], uniq sort @F[1..$#F]]}"' file

Надеюсь, содержимое тега не содержит запятых.

1
28.01.2020, 02:41

Теги

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