Должен ли я использовать 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

Изменить: (Удален бесполезный кот) Спасибо!