$ 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
.
Esto recorrerá cada archivo, asignará todo antes del guión bajo en el nombre del archivo a la variable sample
, luego sustituirá >NODE
por $sample
en el archivo usandosed
:
for file in /path/to/files/*;do
sample=$(echo "${file}" | sed s/_.*//)
sed -i "s/^>NODE/${sample}/" ${file}
done
bash
+sed
solució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 >NODE
subcadena con $pfx
variable en -lugar 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