чтение и отбрасывание строк

Использование 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 символов.

0
26.03.2021, 14:10
4 ответа

Я приведу другой образец, чтобы счет был более наглядным:

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
0
28.04.2021, 22:56

Как насчет того, чтобы начать с

$ 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
$
0
28.04.2021, 22:56

Вы можете использовать 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для получения лучших результатов.

1
28.04.2021, 22:56

Вызывая только awk и избегая задержки сортировки, вы можете использовать:

awk -F- '{c[$1"-"$2]++}END{for (i in c){print i,c[i]}}' file
1
28.04.2021, 22:56

Теги

Похожие вопросы