С zsh
:
autoload zfinit
zfinit
zmodload zsh/datetime
files=N*.TXT
zfopen $host $user $passwd &&
zfcd $remotedir &&
zfrglob files &&
for f ($files) {
t=$EPOCHREALTIME
strftime -s ts %H%M%S ${t%.*}
ts=$ts.${t#*.}
zfgcp -Gt $f N_$ts.TXT
}
zfclose
Используйте регулярное выражение ( [^ [: blank:]]
т.е. непустое) и замените 11
-ое совпадение:
awk '{print gensub (/[^[:blank:]]+/, v, 11)}' v="$value" infile
То же with sed
:
sed "s/[^[:blank:]]\{1,\}/${value}/11" infile
Другой способ, если в вашем файле есть поля фиксированной длины и вы знаете «положение» каждого поля (например, если в вашем образце файла есть только пробелы, 11-е поле занимает 4 символа, с 57-го по 60-е в каждой строке)
awk '{print substr($0,1,56) v substr($0,61)}' v=$value file
или
sed -E "s/^(.{56}).{4}(.*)$/\1${value}\2/" infile
Я бы предложил использовать sed
для вашей задачи:
file1="./Min1_1.traj_COP1A_.27.pdb"
file2="./COP1A_report1"
IFS=',' read -r a value b <"$file2"
#for second field:
sed "s/.[0-9]\b/$value/" "$file1" > TEST1
#for 11th field:
sed "s/\S.\.[0-9]\{2\}\b/$value/" "$file1" > TEST1
С помощью GAWK 4 вы можете сохранить разделители полей, явно разделив строку (или всю строку) и перебирая результат разделения (поля и разделители) для вывода.
В этом примере используются FPAT
(регулярное выражение, определяющее структуру поля) и patsplit ()
, но можно использовать FS
(регулярное выражение, определяющее разделитель полей или содержащее один пробел для представления [\ t \ n] +
) и split ()
вместо этого.
gawk "v=$value" '{n = patsplit($0, arr, FPAT, seps); arr[11] = v; for (i = 0; i <= n; i++) {printf "%s%s", a[i], seps[i]}; print ""}'
Обратите внимание, что a [0]
всегда будет нулевым, seps [0]
будет содержать любой начальный разделитель, а seps [n]
будет любым разделителем символы (пробелы) в конце строки ввода. '
Вот единственная строка в более удобочитаемой форме:
gawk "v=$value" '
{
n = patsplit($0, arr, FPAT, seps);
arr[11] = v;
for (i = 0; i <= n; i++) {
printf "%s%s", a[i], seps[i]
};
print ""
}'