замена части имя строки по имени образца

$ awk -F, 'FNR < 8 { print $0$1 }; FNR > 7 {print $0($1-7)}' arvind.txt 
1,01-JUN-2016,ABC1
2,01-JUN-2016,ABC2
3,01-JUN-2016,ABC3
4,01-JUN-2016,ABC4
5,01-JUN-2016,ABC5
6,02-JUN-2016,ABC6
7,02-JUN-2016,ABC7
8,02-JUN-2016,ABC1
9,02-JUN-2016,ABC2
10,02-JUN-2016,ABC3
11,02-JUN-2016,ABC4
12,02-JUN-2016,ABC5
13,02-JUN-2016,ABC6
14,02-JUN-2016,ABC7

Для номеров строк < 8 выведите всю строку, за которой следует первое поле. Для номеров строк > 7 выведите всю строку, за которой следует значение первого поля минус 7.

Обратите внимание, FNR - это количество входных записей, которые awk уже видел в текущем входном файле. FNR - это встроенная переменная awk. Она не имеет никакого отношения (помимо совпадения) к значениям, которые вы имеете в первом поле вашего входного файла.

BTW, если вы запускаете эту программу с несколькими входными файлами и хотите получить суммарное количество строк для всех входных файлов (а не отдельное количество строк для каждого файла), используйте NR, а не FNR.

1
07.06.2018, 13:08
3 ответа

Esto recorrerá cada archivo, asignará todo antes del guión bajo en el nombre del archivo a la variable sample, luego sustituirá >NODEpor $sampleen el archivo usandosed:

for file in /path/to/files/*;do
  sample=$(echo "${file}" | sed s/_.*//)
  sed -i "s/^>NODE/${sample}/" ${file}
done
0
28.04.2021, 23:46

bash+sedsolución:

for f in p[0-9]*.fasta; do
    pfx="${f%%_*}"
    sed -i "s/^>NODE/>$pfx/" "$f"
done

  • pfx="${f%%_*}"-trunca la parte derecha del nombre del archivo hasta el último _; asignar el resultado a la variablepfx
  • sed -i "s/^>NODE/>$pfx/"-sustituir >NODEsubcadena con $pfxvariable en -lugar
2
28.04.2021, 23:46

Con GNU awk, puede hacerlo en una sola invocación de comando:

gawk -i inplace -F_ -v OFS=_ '
  BEGINFILE {
    node = FILENAME
    sub(".*/", "", node)
    sub("_.*", "", node)
  }
  $1 == ">NODE" {$1 = ">" node}
  {print}'./p*_*.fasta
1
28.04.2021, 23:46

Теги

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