Я не могу получить требуемый результат из кода bash.
У меня есть текстовый файл:
1 0.00 0.00
2 0.00 0.00
3 0.00 0.08
4 0.00 0.00
5 0.04 0.00
6 0.00 0.00
7 -3.00 0.00
8 0.00 0.00
Требуемый вывод должен быть только ненулевыми значениями:
0.08
0.04
-3.0
Это мой код:
z=0.00
while read line
do
line_o = "$line"
openx_de=`echo $line_o|awk -F' ' '{print $2,$3}'`
IFS=' ' read -ra od <<< "$openx_de"
for i in "${od[@]}";do
if [ $i != $z ]
then
echo "openx_default_value is $i"
fi
done
done < /openx.txt
но он также получает нулевые значения.
Чтобы получить только ненулевые значения из столбцов 2 и 3, попробуйте:
$ awk '$2+0!=0{print $2} $3+0!=0{print $3}' openx.txt
0.08
0.04
-3.00
Как это работает:
$2+0 != 0 {print $2}
проверяет, не равен ли второй столбец нулю. Если он не равен нулю, выполняется оператор печати.
Мы хотим выполнить числовое сравнение между вторым столбцом, $2
, и нулем. Чтобы заставить awk рассматривать $2
как число, мы сначала добавляем к нему ноль, а затем выполняем сравнение.
То же самое делается для столбца 3.
Рассмотрим этот входной файл:
$ cat openx2.txt
n first second
1 0.00 0.00
2 0.00 0.00
3 0.00 0.08
4 0.00 0.00
5 0.04 0.00
6 0.00 0.00
7 -3.00 0.00 8 0.00 0.00
Чтобы напечатать имя столбца с каждым найденным значением, попробуйте:
$ awk 'NR==1{two=$2; three=$3; next} $2+0!=0{print two,$2} $3+0!=0{print three,$3}' openx2.txt
second 0.08
first 0.04
first -3.00
@GovindKumar Хорошо. См. обновленный ответ для метода обработки имен столбцов.
awk '{$1 = ""}{gsub(/0.00/,"")}NF{$1=$1;print}' file
0.08
0.04
-3.00
Спасибо, Джон. Можете ли вы помочь в одной модификации. Предположим, входной файл такой же, как и первая строка: «line_n первая секунда». И я должен напечатать ненулевое значение с соответствующим именем столбца.