Как объединить оператор if и отсортировать по команде linux? - PullRequest
0 голосов
/ 07 апреля 2020

Я хочу запустить сценарий Perl несколько раз, используя командную строку для папки, содержащей файлы .coordinates.txt, выполняя несколько «действий», и в качестве последнего шага я хочу сделать сортировку на основе значение строки Я написал это:

 for i in ./*gb.coordinates.txt; do perl myscript $i | 
        awk 'NR==1 {print $2,"\t***here"; next } 1'|sed '2d'| #the output has an empty line in the second row so I remove it and I add "\t***here" to have and idea about the first line value after my final sorting

        if [[awk 'FNR == 1 && $1>0']] then {sort -k1nr} else {sort -k1n} fi
         > $i.allvalues.txt;
   done

Пока здесь:

for i in ./*gb.coordinates.txt; do perl myscript $i | awk 'NR==1 {print $2,"\t***here"; next } 1'|sed '2d' > $i.allvalues.txt; done

Все работает правильно.

Так как я написал выше, мой последний шаг, который я хочу получить, является своего рода как это:

 if the first line of my output >=0 then sort -k1n else sort -k1nr

Выход перед if condition:

XXXX   eiter positive number or negative \t***here
32
4455
-2333
23
-123

И я хочу, чтобы мой вывод был таким:

, если xxxx = положительный

xxxx (going in the correct order)  \t***here
4455
32
23
-123
-2333

if xxxx = отрицательный

xxxx (going in the correct order)   \t***here 
-2333
-123
23
32
4455

Так что моя проблема в том, что я не знаю, к кому подключить оператор if вместе с sort.

1 Ответ

0 голосов
/ 07 апреля 2020

Нет необходимости использовать awk. Передайте выходные данные сценария perl в блок оболочки, который читает первую строку, проверяет, является ли он положительным или отрицательным, а затем вызывает соответствующую сортировку.

for i in ./*gb.coordinates.txt; do 
    perl myscript $i | {
        read _ firstline __
        if (( firstline > 0 ))
        then sort -k1nr
        else sort -k1n
        fi
    } > $i.allvalues.txt
done
...