Как к Поиску значения индекса оценивает из файла больших данных?

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

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

0
02.01.2014, 19:16
2 ответа

Вот немного awk сценария, который я придумал, который должен искать строки, соответствующие Вашим индексам. Просто поместите его в файл (например, lookup.awk) и работайте следующим образом:

lookup.awk

BEGIN {
        # read lookup variables from the commandline and put them in an array
        split(indexes, index_array, " ");
}

NR=1 {
        # set the number of columns to the amount that's on the first line (only used for NA printing)
        nr_of_fields = NF-1;
}

# For every line in your data file do the following
{
        # check if the first field matches a value in the index array
        for (var in index_array) {
                if ($1 == index_array[var]) {
                        # when a match is found print the line and remove the value from the index array
                        print $0;
                        delete index_array[var];
                        next;
                }
        }
}

END {
        # after all matching lines are found, print "NA" lines for the indexes that are still in the array
        for (var in index_array) {
                printf index_array[var];
                for (i=1; i<nr_of_fields; i++) {
                        printf "  NA";
                }
                printf "\n";
        }
}

Можно затем выполнить его как это:

$ awk -f ./lookup.awk -v indexes="1 2 3 4 5 6 7 8 9 10" data.txt | sort -n
1   10  20  30  .   .   -1
2   20  30  40  .   .   -2
3   30  40  50  .   .   -3
4   40  50  60  .   .   -4
5  NA  NA  NA  NA  NA
6   60  60  70  .   .   -5
7  NA  NA  NA  NA  NA
8   80  70  80  .   .   -6
9  NA  NA  NA  NA  NA
10  100 80  90  .   .   -7

Обратите внимание на то, что этот awk сценарий не производит значения в некотором порядке как Ваш индекс (который потребовал бы некоторой дополнительной логики).

2
28.01.2020, 02:28
  • 1
    ! Когда я выполняю $ awk-f./lookup.awk-v индексы = "1 2 3 4 5 6 7 8 9 10" data.txt | вид-n для этого примера, он работает. Проблема состоит в том, что мои индексы - больше чем 1 000. Индексы не являются целыми числами как пример. Они - местоположения широты. –  AiB 02.01.2014, 18:14

Я не уверен, что понимаю, похоже, что Вы хотите, чтобы вывод точно был похож на вход с добавленной строкой, содержащей NAS для любого индекса, не существующего во входном файле. Если так, это должно работать:

$ awk '{
  if(NR==1){fields=NF;}
  if(NR==FNR){i[$1]=$0;}
  else{
    if($1 in i){print i[$1]}
    else{
      printf "%s%s", $1,OFS; 
      for(k=1;k<fields;k++){printf "%s%s","NA",OFS}
      print ""
    }  
  } 
}' data index 
Id  1   2   3   .   .   1344
1   10  20  30  .   .   -1
2   20  30  40  .   .   -2
3   30  40  50  .   .   -3
4   40  50  60  .   .   -4
5 NA NA NA NA NA NA 
6   60  60  70  .   .   -5
7 NA NA NA NA NA NA 
8   80  70  80  .   .   -6
9 NA NA NA NA NA NA 
10  100 80  90  .   .   -7

Лично, хотя, я сделал бы это в Perl:

$ cat data index | perl -ne '@a=split(/\s+/); 
   if($#a>1){$id{$a[0]}=$_; $na||="NA "x$#a . "\n";}
   else{$f=$id{$a[0]}||"$a[0] $na"; print "$f"}'
Id  1   2   3   .   .   1344
1   10  20  30  .   .   -1
2   20  30  40  .   .   -2
3   30  40  50  .   .   -3
4   40  50  60  .   .   -4
5 NA NA NA NA NA NA 
6   60  60  70  .   .   -5
7 NA NA NA NA NA NA 
8   80  70  80  .   .   -6
9 NA NA NA NA NA NA 
10  100 80  90  .   .   -7
1
28.01.2020, 02:28
  • 1
    @slm NA, не ни для каких данных в индексе данных. Я хочу посмотреть значения от индекса данных, которые имеют тот же индексный идентификатор и хранилище в новом файле. Мой пример может быть плохим для объяснения моего вопроса. Я имею в файлы, индекс данных и индексирую идентификатор. Я хочу, создают новый файл из индекса данных, которые имеют тот же индексный идентификатор. –  AiB 02.01.2014, 18:07
  • 2
    @Abraham - Я просто отредактировал ответ Terdon, направьте свой комментарий к нему. Также, если необходимо совершенствовать Q, затем сделайте так, и не только здесь на комментарии A. Тем путем все могут извлечь выгоду из Вашего становления Q более ясным. –  slm♦ 02.01.2014, 18:12
  • 3
    @Terdon - У Abraham есть некоторая обратная связь на Вашем A. спасибо –  slm♦ 02.01.2014, 18:12
  • 4
    @Abraham, таким образом, Вы не хотите NA? Просто ничто? Отредактируйте свой вопрос и покажите точный вывод, который Вы хотите. –  terdon♦ 02.01.2014, 18:57
  • 5
    @terdon, я отредактировал свой вопрос. Я хочу, чтобы NA был сохранен в выходном файле для идентификатора, которые не имеют никаких значений в файле данных.Спасибо! –  AiB 02.01.2014, 19:47

Теги

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