Я пытаюсь удалить первый и последний символы каждой строки в текстовом файле и сохранить полученную усеченную версию в новом файле. Кто-нибудь есть идеи о том, как сделать это эффективно с помощью awk
или других программ / команд Linux, специально для больших файлов?
input.txt
(s,2,4,5,6)
"s,1,5,5,2"
{z,0,4,5,3}
[y,2,4,5,5]
(y,4,4,5,7)
(r,20,4,5,7)
(e,9,4,5,2)
Ожидаемый output.txt
s,2,4,5,6
s,1,5,5,2
z,0,4,5,3
y,2,4,5,5
y,4,4,5,79
r,20,4,5,7
e,9,4,5,2
text-processing
sed
awk
pacodelumberg
источник
источник
ssed
или набор инструментов из семейной реликвииsed
может обеспечить лучшую производительность.sed
По вашему вопросу удалите последнее и первое слово из входного файла, как показано ниже:
источник
s/.\(.*\).$/\1/
. Это может быть быстрее из-за неиспользования обратных ссылок, и в вопросе упоминались «большие файлы».time yes | head -n 10000000 | COMMAND >/dev/null
. Я получаюrev input | cut -c2- | rev | cut -c2-
→ 0,14 с,sed 's,.\(.*\).$,\1,'
→ 3,38 с;awk '{print substr($0,2,length()-2);}'
→ 3,50 с;sed 's/.$//; s/^.//'
→ 5.09с.sed 's/.\(.*\)./\1/'
кажется быстрее, чемsed 's/^.\(.*\).$/\1/'
(GNU sed снова). Кроме того, производительность зависит от локали (интерпретация того, что символ) и отsed
реализации (в этом отношении sed из набора инструментов семейной реликвии значительно быстрее, чем GNU sed).Есть много возможностей, как всегда
объяснение
,
- разделитель sed может быть любым другим символом, если его экранировать там, где это необходимо..
Совпадение с одним персонажем\(.*\)
- Сгруппируйте оставшуюся часть, и она сохраняется для последующего извлечения..
Снова сопоставьте один символ$
- Конец линии\1
- вывести текст, соответствующий группе вышеg
заменить глобально на линии.источник
g
? в каждой строке будет только один матч.Вы также можете сделать это,
awk
если вы предпочитаетеисточник
Это должно работать так же. Он хорошо «переводит» каждый из символов в ничто (удаляет).
Недостатком является то, что он удалит их, если они не будут первым / последним символом. Он также пропустит любые символы окончания, которые вы не перечислили в
()[...
.источник