, если это LTO или другая лента со вспомогательной памятью:
sg_logs -a /dev/sgX
где sgX - это универсальное устройство SCSI, соответствующее вашему ленточному накопителю ( sg_map
или sg_scan
могут помочь вам найти его, если вы еще не знаете его, например, из проверки предупреждений на магнитной ленте)
Чуть более эффективный способ с sed
:
sed 'h; s/b//g; x; s/a//g; H; x; s/\n//' file.txt
С perl
:
perl -lpe '$_ = y/b//dr . y/a//dr' file.txt
Другой способ с perl
:
perl -lpe '$_ = join "", sort split //' file.txt
(это работает, потому что "a" lt "b"
).
С GNU awk
:
awk '{ print gensub(/b/, "", "g") gensub(/a/, "", "g") }' file.txt
С bash
:
while read -r line; do
printf '%s%s\n' "$( tr -d b <<<"$line" )" "$( tr -d a <<<"$line" )"
done <file.txt
Я создал файл с именем test.txt и выполнил следующую команду:
sed -e ':loop' -e 's/ba/ab/' -e 't loop' test.txt
if [[ "${row:$j:1}" == a ...
Если вы идете этим путем, я думаю, вы могли бы просто сделать все это в оболочке:
while read -r s ; do
for (( i = 0 ; i < ${#s} ; i++ )) ; do
[ "${s:i:1}" = "a" ] && astr+=a || bstr+=b
done
echo "$astr$bstr"
done
perl -pe 's/(b+)(a+)/$2$1/ while /ba/' data.file
до тех пор, пока запись содержит «b», за которой следует «a», мы продолжаем переворачивать «острова» пчел и да в текущей записи.
perl -F\(b+\) -lne '
my @A;
splice @A, (/b/ ? @A : 0), 0, $_ for @F;
print @A;
' data.file
Мы инициализируем массив @A для каждой прочитанной записи/строки. Поля, вырезанные из записи (хранящиеся в @F), проверяются, и когда они содержат «b», помещаются в конец массива, в противном случае размещенного с начала. Наконец, мы печатаем массив.