У меня есть входной файл с ~ 100 строк и ~ 100 полей в строке.Каждое поле представляет положительное или отрицательное значение.Я хочу вывести $ 1, за которым следуют только положительные или отрицательные поля в каждой строке.Количество положительных или отрицательных полей в строке является случайным.
выборочный ввод
0 x 9 8 7 -1 -2 -3
2 x 7 6 -2 -3 -4 -5
4 x 4 3 2 1 -6 -7
желаемый вывод
положительный
0 9 8 7
2 7 6
4 4 3 2 1
отрицательный
0 -1 -2 -3
2 -2 -3 -4 -5
4 -6 -7
контекст и попытка
Приведенные выше выходные данные выводят $ 1, за которым следуют положительные или отрицательные значения в оставшихся полях в той же строке, что и $ 1.
Текущий кодЯ попытался (для положительных значений, начиная со строки 6 в моем вводе):
awk 'NR>5{for(i=3; i<=NF; i++) if ( $i > 0 ) print $1, $i}' input > output
Это работает нормально, за исключением того, что я печатаю вывод как:
0 9
0 8
0 7
2 7
2 6
4 4
4 3
4 2
4 1
Я также пробовал:
awk 'BEGIN {ORS="\t"} NR>5 {print $1} {for(i=3;i<=NF;i++) if ( $i > 0 && i <= NF} {print $i}}' input > output
но тогда я никогда не перейду на новую строку в выводе.Если я изменяю ORS обратно на \ n с помощью некоторого условия 'else if (i = NF) {ORS = ...}', то он выводит все выходные данные поля для каждого i на новой строке, так как инструкция BEGIN не имеет никакого эффекта.
вопрос
Как я могу сказать awk напечатать $ 1, затем распечатать все другие выходные данные из той же строки ввода в той же строке вывода, затем продвинуть 1 новую строку в выходе и повторить процессдля следующей строки ввода?
Спасибо.
ответ на ответ Tiw
Я пытался выполнить это в цикле для моих двух файлов:
for j in 1 2; do
positive=ofile.p0
negative=ofile.m0
awk 'NR>5{
printf $1>"positive";
printf $1>"negative";
for(i=3;i<=NF;i++)
if($i~/[-+]?[0-9]+/)
if ($i>0) printf OFS $i>"positive";
else if($i<0) printf OFS $i>"negative";
print "">"positive";
print "">"negative";
}'ofile.0$j
mv positive $positive$j
mv negative $negative$j
done
но зависает.Изменить: Ответ Tiw обновлен с% s в printf.Это работает с этим изменением.