Я провел много исследований по этому вопросу. Вы можете сделать тест на файле с подсчетом слов, но он не даст вам того же числа, что и du -sb adir
.
tar -tvOf afile.tar | wc -c
du
считает каждый каталог как 4096 байт, а tar
считает каталоги как 0 байт. Вы должны добавить 4096 к каждому каталогу:
$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096)))
затем вы должны добавить все символы. Для чего-то, что выглядит так:
$(( $(tar -tvOf afile.tar 2>&1 | grep '^d' | wc -l) * 4096 + $(tar -xOf afile.tar | wc -c) ))
Я не уверен, что это идеально, поскольку я не пробовал файлы, которые были тронуты (файлы с 0 байтами) или файлы с 1 символом. Это должно приблизить вас к идеалу.
Исходя из ожидаемого результата, может быть что-то вроде:
awk 'NF <= 1 || !seen[substr($0, 11, 11)]++'
Или
awk 'NF <= 1 || !seen[substr($2, 1, 11)]++'
Или сохранить последнюю запись:
awk '!second_pass {if (NF > 1) count[substr($2, 1, 11)]++; next}
NF <= 1 || --count[substr($2, 1, 11)] == 0' file second_pass=1 file
команда:header=
sed -n '1p' l.txt ; footer=
sed -n '$p' l.txt;sed -e '1d' -e '$d' l.txt |awk '{if (!seen[$2]++)print $0}'| sed '1i '$header''| sed '$s/.*/&\n'$footer'/g'
выход
header=`sed -n '1p' l.txt`; footer=`sed -n '$p' l.txt`;sed -e '1d' -e '$d' l.txt |awk '{if (!seen[$2]++)print $0}'| sed '1i '$header''| sed '$s/.*/&\n'$footer'/g'
Header:0000000000000001457854500000
XP 12345678912yeyeyeyeeye 0000003
XP 12345678913yeyeyeyeeye 0000002
Footer:0000000000000001245856500004