Я новичок в работе со скриптом bash. У меня есть файл данных:
i z r
0 -30 3.5
0 -29.5 3.4
0 -29 3.6
...
0 29.5 4.2
0 30 4.6
1 -30 2.8
1 -29.5 3.4
....
1 30 5.2
2 -30 2.5
2 -29.5 2.6
И я пытаюсь упорядочить данные в файл следующим образом:
i z r
0 -30 3.5
1 -30 2.8
2 -30 2.5
...
0 -29.5 3.4
1 -29.5 3.4
2 -29.5 2.6
...
Я использовал приведенный ниже скрипт, но он не может работать как Я желаю.
awk '{
for(z=/-30/; z<=30; z+=0.5){
for(i=0; i<=17489;i++){
if($1==$i && $2==$z)
print $1 $2 $3
}
}
}' data.dat >> avg_SD.dat
, пожалуйста, помогите мне! Большое вам спасибо.
От примера и Вашего сценария это кажется, что Ваш исходный файл отсортирован по первому столбцу (i), но Вы хотите, чтобы он был, прежде всего, отсортирован по второму столбцу (z) вместо этого и, чем мной.
Это может быть достигнуто намного легче с sort
tail -n +2 data.dat | sort -n -k 2 -k 1 >> avg_SD.dat
Это также, вероятно, намного быстрее, чем цикличное выполнение через два цикла и выполнение по крайней мере одного миллиона сравнений для каждой строки во входном файле.
Объяснение:
tail -n +2 data.dat
печать data.dat
запуск со второй строки, таким образом удаление заголовка.
|
перенаправляет вывод команды слева к входу команды справа.
sort -n -k 2 -k 1
сортирует вход численно (-n
), сначала вторым полем (-k 2
) чем первым полем (-k 1
)
>> avg_SD.dat
печатает вывод к avg_SD.dat
хранение предыдущего содержания. Если Вы хотите перезаписать предыдущее содержание, используйте сингл >
вместо >>
.
Если нет никакого заголовка в исходном файле, Вам не нужно tail
и может передать data.dat
непосредственно к sort
как аргумент:
sort -n -k 2 -k 1 data.dat >> avg_SD.dat