Как Linux управляет смещениями файлов

Вы должны были опубликовать несколько примеров строк и Ваш текущий сценарий, чтобы получить точный ответ.
Я бы не стал сравнивать, меньше ли число, но сохранил бы общее смещение при обработке строки после добавления смещения [0 для первого файла] и отрегулировал смещение.

Пример :awk 'FNR==1&&ARGIND>1{distoffset=distnow}{$2+=distoffset;distnow=$2+$3;print $0;}'

Предполагая, что у вас есть расстояние в поле 2 и длина текущей записи в поле 3 (это необходимо добавить к расстоянию предыдущей записи. Я предполагаю, что в противном случае первая запись файла имела то же расстояние, что и последняя запись предыдущего файла. файл.

По другому Вашему вопросу я не понимаю, чего Вы хотите. Добавление приращения 0,05 тоже не проблема, но не могу сказать Вам, как это сделать, если я не понимаю точного требования.


Таким образом, с дополнительной информацией с Вашей стороны я могу сделать свой пример более полным.
Сначала более подробная версия:

rm -f all.csv
awk '
FNR==1 {
 if (ARGIND>1) {
  timeoffset = timenow + 0.05;
  feetoffset = feetnow;
  metersoffset = metersnow;
  milesoffset = milesnow;
  kmeteroffset = kmeternow;
 } else {
  print $0;
 }
 next;
}
FNR>1{
 $1 += timeoffset; timenow = $1;
 $2 += feetoffset; feetnow = $2;
 $3 += metersoffset; metersnow = $3;
 $4 += milesoffset; milesnow = $4;
 $5 += kmeteroffset; kmeternow = $5;
 print $0;
}
' *.csv > all.csv

И еще один, использующий вместо этого циклы и массив:

rm -f all.csv
awk '
FNR==1 {
 if (ARGIND>1) {
  for (cfn = 1; cfn <= NF; cfn++) {
   offsetvals[cfn] = savedvals[cfn];
  }
  offsetvals[1] += 0.05;
 } else {
  print $0;
 }
 next;
}
FNR>1{
 for (cfn = 1; cfn <= NF; cfn++) {
  $cfn += offsetvals[cfn];
  savedvals[cfn] = $cfn;
 }
 print $0;
}
' *.csv > all.csv

И версия с циклом, которая является более общей и может повторно использоваться для файлов, где это не должно применяться ко всем полям или должно быть динамическим:

rm -f all.csv
awk '
BEGIN {
 procfields["tm"] = 1;
 procfields["ft"] = 2; procfields["mt"] = 3;
 procfields["ml"] = 4; procfields["km"] = 5; 
}
FNR==1 {
 if (ARGIND>1) {
  for (fnname in procfields) {
   cfn = procfields[fnname];
   offsetvals[cfn] = savedvals[cfn];
  };
  offsetvals[procfields["tm"]] += 0.05;
 } else {
  print $0;
 }
 next;
}
FNR>1{
 for (fnname in procfields) {
  cfn = procfields[fnname];
  $cfn += offsetvals[cfn];
  savedvals[cfn] = $cfn;
 };
 print $0;
}
' *.csv > all.csv

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

Вы можете опустить все пробелы, включая символы новой строки из скрипта AWK, которые не находятся в кавычках (в этом случае пробелы вообще не заключаются в кавычки/необходимы ), как Вы предпочитаете. (Также можно опустить некоторые полу -коклоны, но я предпочитаю этого не делать.)

1
12.11.2020, 06:13
0 ответов

Теги

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