如何从每一行中找到否定数字,并使用shell脚本只打印一次

时间:2016-02-29 13:52:11

标签: bash awk sh

我想从输入文件的每一行中找到负数(相同的值)。 如果一行中没有负数,则将打印0.如果出现多个负数,则会打印一次负数。例如 输入文件是(input.txt):

 1       0       0       0       0       0       0       0       0
 1       1      -1       0      -1       0       1       0       0
 1       1       0      -1       0       0       1       0      -1
 1       1       0       0      -1       0       0       0       0

所需的输出是:

 0
-1
-1
-1

目前我正在使用

awk '{for(i=1; i<=NF;i++)if($i ~ /^-/) {printf "%s\n",$i}}' input.txt > output

但它不会在第1行产生0并且它会打印所有-1。 这个问题有智能解决方案吗?

4 个答案:

答案 0 :(得分:2)

你可以在bash中使用简单的模式匹配来完成此操作,不需要awk。

while read line; do
  if [[ $line = *-1* ]]; then
    echo -1
  else
    echo 0
  fi
do < inputfile

或缩短为单行:

while read l; do [[ $l = *-1* ]] && echo -1 || echo 0; done < inputfile

或者sed可以这样做:

sed '/-/s/.*/-1/;/-/!s/.*/0/' inputfile

或者如果你愿意简单地换取性能:

sed -e '/-/s/.*/-1/;t' -e 's/.*/0/' inputfile

答案 1 :(得分:1)

你可以使用这个awk:

awk '{p=0; for(i=1; i<=NF;i++) if ($i<0) {p=$i; break} print p}' file

0
-1
-1
-1

答案 2 :(得分:1)

$ awk '{print (/-/?-1:0)}' file
0
-1
-1
-1

我认为:

  1. 您不能使用-2代替-1 s,或
  2. 如果确实发生了这种情况,您仍然希望-1输出
  3. 因为如果可能发生-2 s行而不是-1 s行并且希望在这种情况下输出-2那么那将是一件非常明显的事情。包含在您的样本输入/输出中。

答案 3 :(得分:0)

根据您的问题描述,您可以使用:

 awk '/-/{print "-1"}!/-/{print "0"}' file