我想从输入文件的每一行中找到负数(相同的值)。 如果一行中没有负数,则将打印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。 这个问题有智能解决方案吗?
答案 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
我认为:
-2
代替-1
s,或-1
输出因为如果可能发生-2
s行而不是-1
s行并且希望在这种情况下输出-2
那么那将是一件非常明显的事情。包含在您的样本输入/输出中。
答案 3 :(得分:0)
根据您的问题描述,您可以使用:
awk '/-/{print "-1"}!/-/{print "0"}' file