Как добавить новый элемент в каждую строку файла

Отель использовал сеть 172.17.x.x, как и моя установка докера --, поскольку в настоящее время ни один клиент не требовал от меня использования экземпляров докера, я удалил его, и перенаправление входа для входа перестало вызывать проблемы.

1
24.08.2021, 21:41
3 ответа

Использованиеawk:

awk -F _ 'NR > 1 { $0 = sprintf("%s_%d, %s_%d", $1, $2-1, $1, $2) }; 1' file

или немного короче,

awk -F _ 'NR > 1 { $0 = sprintf("%s_%d, %s", $1, $2-1, $0) }; 1' file

Это предполагает, что вы хотите оставить первую строку нетронутой и хотите, чтобы между результирующими столбцами была запятая. Удалите запятую из строки формата sprintf(), если запятая не нужна.

Код ничего не делает с первой строкой, но переписывает все остальные строки, используя sprintf()в соответствии с шаблоном chrX_(N-1), chrX_N, который, кажется, является тем, о чем вы просите.

Биты исходной строки, т. е. название хромосомы и геномное положение на хромосоме, выбираются путем обработки данных как двух_-полей с разделителями. Таким образом, имя хромосомы считывается в $1, а положение — в $2.

1в самом конце кода awkвызывает вывод данных, измененных или нет.

Вывод данных вашего примера:

CHROM_POS
chr10_100009634, chr10_100009635
chr10_100187979, chr10_100187980
chr10_100229691, chr10_100229692
chr10_100267649, chr10_100267650
chr10_100269674, chr10_100269675
chr10_100279429, chr10_100279430
chr10_100285898, chr10_100285899
4
24.08.2021, 22:37

Perl-решение:

perl -p -e 's;([^_]+)_(\d+);"$1_". ($2 - 1). " $1_$2";e'

Флаг -pзацикливается на всех строках, -eдает скрипт в качестве аргумента. Модификатор ([^_]+)фиксирует то, что предшествует _, в $1, (\d+)captures the digits into$2 , the e `для замены разрешающих выражений.

Введите файл ввода в качестве аргумента или просто в качестве стандартного ввода.

6
24.08.2021, 23:43

Решение на основе Awk -:

awk -F '_' -v OFS=, 'NR>1{ $0 = $1 FS $2-1 OFS $0 }1' file

Результаты:-

CHROM_POS
chr10_100009634,chr10_100009635
chr10_100187979,chr10_100187980
chr10_100229691,chr10_100229692
chr10_100267649,chr10_100267650
chr10_100269674,chr10_100269675
chr10_100279429,chr10_100279430
chr10_100285898,chr10_100285899

Другие подходы:

[перл]

perl -lsne '
  print $.>1 ? s/(\d+)$/$1-1/re : (), $_;
' -- -,=, file

[Питон3]

python3 -c 'import sys
with open(sys.argv[1]) as f:
  for nr,_ in enumerate(f,1):
    _ = _.rstrip("\n")
    if nr > 1:
      p = _.find("_") + 1
      _ = _[:p] + f"{int(_[p:])-1}," + _
    print(_)
' file

[GNU dc] калькулятор RPN

< file \
sed 's/^/[/;1s/$/]/;1!s/_/&]/' |
dc ​-e "
[q]sq
[rdnrd1-n44anrnpc]sp
[?z0=q lpx z0=?]s?
?pc l?x
"

[GNU-сед]

sed -Ee '1b
  h
  s/^[^_]*_//
  s/$/\n9876543210/;tdecr
  :decr
  s/([^0])\n.*\1(.).*/\2/;tdone
  s/([^0])(0+\n.*\1(.))/\3_\2/
  :loop
    s/_0(0*\n)/9_\1/
  tloop
  s/_.*//
  :done
  G
  s/.*\n([^_]*_)/\1&/
  y/\n/,/
' file
0
25.08.2021, 11:40

Теги

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