Использование sed:
$ sed -E '/^SHIPTO/ s/(.{9}).{8}/\1NuValue /' file
HEADER 123456
SHIPTO NuValue 123 LANE HOUSTON TX
ITEM ACME BRICK
Как это работает:
/^SHIPTO/
Выбирает строки, начинающиеся с SHIPTO
. Следующая команда замены будет применяться только к этим строкам.
s/(.{9}).{8}/\1NuValue /
Это соответствует первым 9+8 символам строки и сохраняет первые 9 символов строки в группе 1. Эти символы заменяются группой 1, \1
и вашим новым значением (, которое, чтобы сохранить формат должен состоять из 8 символов.
Я приведу другой образец, чтобы счет был более наглядным:
GTEX-1117F-0003-SM-58Q7G
GTEX-1117F-0003-SM-58Q7G
GTEX-1117F-0003-SM-5DWSB
GTEX-111CU-0826-SM-5EGIJ
GTEX-111CU-0926-SM-5EGIK
GTEX-ZZPU-2726-SM-5NQ8O
GTEX-ZZPU-2626-SM-5E45Y
K-562-SM-2AXVE
Команда, предполагающая, что идентификатор пациента имеет форматstring-string
:
$ cut -d'-' -f1,2 file | uniq -c | awk -F' ' '{ print $2,$1}' | sort -rk2 | head -1
GTEX-1117F 3
Как насчет того, чтобы начать с
$ for F in `cat patients`; do echo -n "$F " ; grep "^$F" records | wc -l; done
GTEX-1117F 2
GTEX-111CU 2
GTEX-ZZPU 2
K-562 2
$
Вы можете использовать cut
для извлечения первых двух полей, разделенных тире -в каждой строке, отсортировать результат и подсчитать, сколько раз встречается каждая уникальная строка:
$ cut -d '-' -f 1,2 file | sort | uniq -c | sort -n | head
2 GTEX-1117F
2 GTEX-111CU
2 GTEX-ZZPU
2 K-562
Это также пропускает данные через sort -n
для сортировки по числам и использует head
для получения лучших результатов.
Вызывая только awk и избегая задержки сортировки, вы можете использовать:
awk -F- '{c[$1"-"$2]++}END{for (i in c){print i,c[i]}}' file