Должен ли я использовать cut или awk для извлечения полей и подстрок полей?
У меня есть файл с полями, разделенными по каналам. Я хочу напечатать подмножество поля 1 и всего поля 2:
cat tmpfile.txt
# 10 chars.|variable length num|text
ABCDEFGHIJ|99|U|HOMEWORK
JIDVESDFXW|8|C|CHORES
DDFEXFEWEW|73|B|AFTER-HOURS
Я хочу, чтобы результат выглядел так:
# 6 chars.|variable length num
ABCDEF|99
JIDVES|8
DDFEXF|73
Я знаю, как получить поля 1 и 2:
cat tmpfile.txt | awk '{FS="|"} {print $1"|"$2}'
И знаете, как получить первые 6 символов поля 1:
cat tmpfile.txt | cut -c 1-6
Я знаю, что это довольно просто, но я не могу понять, как объединить команды awk
и cut
.
Приветствуются любые предложения.
Ответы
Ответ 1
Вы можете использовать awk
. Используйте функцию substr()
, чтобы обрезать первое поле:
awk -F'|' '{print substr($1,1,6),$2}' OFS='|' inputfile
Для ввода введите:
ABCDEF|99
JIDVES|8
DDFEXF|73
Используя sed
, вы можете сказать:
sed -r 's/^(.{6})[^|]*([|][^|]*).*/\1\2/' inputfile
для получения того же выхода.
Ответ 2
Вы можете использовать вырезание и вставку, но тогда вам нужно дважды прочитать файл, что очень важно, если файл очень большой:
paste -d '|' <(cut -c 1-6 tmpfile.txt ) <(cut -d '|' -f2 tmpfile.txt )
Ответ 3
Только для другого варианта: awk -F\| -vOFS=\| '{print $1,$2}' t.in | cut -c 1-6,11-
Кроме того, поскольку трижды указывает, два сокращения также могут сделать это: cut -c 1-6,11- t.in | cut -d\| -f 1,2
Ответ 4
Мне нравится комбинация cut и sed, но это только предпочтение:
cut -f1-2 -d"|" tmpfile.txt|sed 's/\([A-Z]\{6\}\)[A-Z]\{4\}/\1/g'
Результат:
# 10-digits|variable length num
ABCDEF|99
JIDVES|8
DDFEXF|73
Изменить: (Удален бесполезный кот) Спасибо!