При переименовании файла Вы не изменяете файл, Вы изменяете его родительский каталог. Имя файла является записью в каталоге. Думайте о телефонных каталогах, чтобы изменить имя, связанное с номером телефона в каталоге, необходимо изменить каталог, не телефонную линию. Имя связано с телефонной линией только в том каталоге. Тот номер телефона может быть в другом каталоге под другим именем (жесткие ссылки).
Существует протест, хотя для переименования каталогов, поскольку каталоги содержат ссылку на своего родителя (их ..
запись). Чтобы смочь переместить каталог, недостаточно иметь разрешение записи к старому родителю (для удаления записи) и новый родитель (для добавления новой записи), у Вас также должно быть разрешение записи к самому каталогу для обновления ..
запись (если старый и новый родитель отличается).
Вот немного 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 сценарий не производит значения в некотором порядке как Ваш индекс (который потребовал бы некоторой дополнительной логики).
Я не уверен, что понимаю, похоже, что Вы хотите, чтобы вывод точно был похож на вход с добавленной строкой, содержащей 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
NA
? Просто ничто? Отредактируйте свой вопрос и покажите точный вывод, который Вы хотите.
– terdon♦
02.01.2014, 18:57