Другие языки программирования и технологии
Bash: awk, переменные, параметр...
нужно в цикле использовать номер очередного параметра. единственное до чего додумалась: c=1 while test $c -le $# do awk '{for(i=1;i<=NF;i++) if($i==$($c)) (вот тут ошибка: вместо того, что я хочу - $1(2,3,...) выдает нечто) printf $i; printf "\n";}' c=$(($c+1)) done а вобще задача вот в чем заключается: нужно из файла вывести на печать строки, номера которых заданы параметром.
$c экранируется одинарными кавычками, в вашем примере нужно делать примерно так
....
awk "{for(i=1;i<=NF;i++)
if(\$i==\$($c))
printf \$i;
printf \"\n\";}"
....
но поставленную задачу лучше будет решить вот так:
script.awk:
BEGIN {
for (i = 1; i < ARGC; i++) {
lines[ARGV[ i ]] = 1;
delete ARGV[ i ];
}
}
{ if (lines[NR]) {print} }
# awk -f script.awk 1 2 4 6 < /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
однако вместо sh+awk проще будет использовать perl
1) строки выводятся в порядке появления без повторов
#!/usr/bin/perl
my %lines;
$lines{$_} = 1 foreach @ARGV;
while(<STDIN>) {
print if $lines{$.};
}
2) строки выводятся в строгом порядке, необходимое количество раз
#!/usr/bin/perl
my %lines;
$lines{$_} = 1 foreach @ARGV;
while(<STDIN>) {
$lines{$.} = $_ if $lines{$.};
}
print $lines{$_} foreach(@ARGV);
3) то же, что и в предыдущем варианте, но данные перед обработкой загружаются в память целиком (подходит для небольших файлов)
#!/usr/bin/perl
my @strings = <STDIN>;
print $strings[$_ - 1] foreach(@ARGV);
если что непонятно - пишите.
PS: побольше бы таких вопросов :)
....
awk "{for(i=1;i<=NF;i++)
if(\$i==\$($c))
printf \$i;
printf \"\n\";}"
....
но поставленную задачу лучше будет решить вот так:
script.awk:
BEGIN {
for (i = 1; i < ARGC; i++) {
lines[ARGV[ i ]] = 1;
delete ARGV[ i ];
}
}
{ if (lines[NR]) {print} }
# awk -f script.awk 1 2 4 6 < /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
однако вместо sh+awk проще будет использовать perl
1) строки выводятся в порядке появления без повторов
#!/usr/bin/perl
my %lines;
$lines{$_} = 1 foreach @ARGV;
while(<STDIN>) {
print if $lines{$.};
}
2) строки выводятся в строгом порядке, необходимое количество раз
#!/usr/bin/perl
my %lines;
$lines{$_} = 1 foreach @ARGV;
while(<STDIN>) {
$lines{$.} = $_ if $lines{$.};
}
print $lines{$_} foreach(@ARGV);
3) то же, что и в предыдущем варианте, но данные перед обработкой загружаются в память целиком (подходит для небольших файлов)
#!/usr/bin/perl
my @strings = <STDIN>;
print $strings[$_ - 1] foreach(@ARGV);
если что непонятно - пишите.
PS: побольше бы таких вопросов :)
1) ввести данные - количество слагаемых n и число x;
2) присвоить переменной, в которой будем хранить степени sin x, значение 1; S := 0;
3) присвоить параметру цикла значение 1;
4) если значение параметра цикла меньше n, перейти к следующему пункту, иначе к п. 9;
5) вычислить очередную степень sin x;
6) добавить вычисленное значение к сумме;
7) увеличить параметр цикла на 1;
8) перейти к п. 4;
9) вывести на печать сумму S;
10) конец.
{Программа вычисления суммы степеней sin x}
Program Summa;
Var S, X, Pr : Real; N, I : Integer;
Begin
Write('Введите число слагаемых и x: '); ReadLn(N, X);
Pr := 1; {в этой переменной хранятся последовательные степени sin x}
S := 0;
For I := 1 To N Do
Begin
Pr := Pr * Sin(X); {Очередная степень Sin(x)}
S := S + Pr
End;
WriteLn('Сумма равна ', S : 7 : 4)
End.
2) присвоить переменной, в которой будем хранить степени sin x, значение 1; S := 0;
3) присвоить параметру цикла значение 1;
4) если значение параметра цикла меньше n, перейти к следующему пункту, иначе к п. 9;
5) вычислить очередную степень sin x;
6) добавить вычисленное значение к сумме;
7) увеличить параметр цикла на 1;
8) перейти к п. 4;
9) вывести на печать сумму S;
10) конец.
{Программа вычисления суммы степеней sin x}
Program Summa;
Var S, X, Pr : Real; N, I : Integer;
Begin
Write('Введите число слагаемых и x: '); ReadLn(N, X);
Pr := 1; {в этой переменной хранятся последовательные степени sin x}
S := 0;
For I := 1 To N Do
Begin
Pr := Pr * Sin(X); {Очередная степень Sin(x)}
S := S + Pr
End;
WriteLn('Сумма равна ', S : 7 : 4)
End.
Ромачка Гарифуллин
мне почему-то кажется что вы ошиблись ответом
Похожие вопросы
- Как в Git Bash вернуть веб-хостинг для локального репозитория на изначальный. Описание внутри
- С# - нужно сделать так, чтобы консоль читала слова, как переменные, а не просто слова...
- Как сложить переменную ? Delphi 7 Что никто не знает ответа что ли ?Н
- Снова Паскаль) ) Переменные и занимаемая ими память
- Указатели это переменные в которых содержатся адреса других переменных?
- С++, объект класса, экземпляр класса, какой тип переменной хранит экземпляр класса? (экземпляр это что? Word, lpstr..?)
- Как вернуть значение переменной присвоенное ранее? Pascal
- [C++] Почему не рекомендуют использовать глобальные переменные?
- В каких случаях в Си надо использовать переменные static, а не глобальные переменные?
- Как найти найбольшую переменную в языке java?
http://pastebin.com/c3bXYZVj
# ./script.sh 3 2 1 2 1 1 < /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
спасибо большое, щас буду разбираться. если что не пойму - напишу :)