【问题标题】:awk without printing newlineawk 不打印换行符
【发布时间】:2011-01-02 13:55:16
【问题描述】:

我希望在每次迭代中并排打印变量 sum/NR。我们如何避免 awk 在每次迭代中打印换行符?在我的代码中,每次迭代都会默认打印一个换行符

for file in cg_c ep_c is_c tau xhpl
printf "\n $file" >> to-plot.xls
    for f in 2.54 1.60 800 
        awk '{sum+=$3}; END  {print  sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
    done
done

我希望输出看起来像这样

cg_c ans1  ans2  ans3  
ep_c ans1  ans2  ans3 
is_c ans1  ans2  ans3
tau  ans1  ans2  ans3 
xhpl ans1  ans2  ans3

我现在的输出是这样的

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3

【问题讨论】:

    标签: scripting awk newline


    【解决方案1】:

    awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls

    print 默认会插入一个换行符。您不希望这种情况发生,因此请改用printf

    【讨论】:

    • 但请注意printf 会解释%s,因此请使用printf "%s" whatever 而不是printf whatever
    • printf "%s",whatever 你忘了逗号。您还可以扩展更多变量并用逗号分隔它们。
    【解决方案2】:

    AWK 中的 ORS(输出记录分隔符)变量默认为“\n”,并在每一行之后打印。如果您希望连续打印所有内容,可以在BEGIN 部分将其更改为“”。

    【讨论】:

    • 您甚至可能希望将其设置为""(无空格)以完全没有分隔。
    • 像这样:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
    • 或者ORS="\r",如果你想要例如打印一个显示进度的计数器。
    【解决方案3】:

    我猜很多人正在进入这个问题,寻找一种避免awk 中的新行的方法。因此,我将提供一个解决方案,因为特定上下文的答案已经解决了!

    awk中,print在打印后自动插入ORSORS 代表“输出记录分隔符”,默认为新行。所以每当你说print "hi" awk 打印“hi”+新行。

    这可以通过两种不同的方式进行更改:使用空的ORS 或使用printf

    使用空的ORS

    awk -v ORS= '1' <<< "hello
    man"
    

    这会返回“helloman”。

    这里的问题是并不是所有的 awk 都接受设置一个空的ORS,所以你可能需要设置另一个记录分隔符。

    awk -v ORS="-" '{print ...}' file
    

    例如:

    awk -v ORS="-" '1' <<< "hello
    man"
    

    返回“hello-man-”。

    使用printf(首选)

    虽然print 在记录后附加ORS,但printf 没有。因此,printf "hello" 只打印“hello”,没有别的。

    $ awk 'BEGIN{print "hello"; print "bye"}'
    hello
    bye
    $ awk 'BEGIN{printf "hello"; printf "bye"}'
    hellobye
    

    最后,请注意,通常这会遗漏最后一个新行,因此 shell 提示符将与输出的最后一行位于同一行。要清除它,请使用END {print ""},以便在所有处理后打印一个新行。

    $ seq 5 | awk '{printf "%s", $0}'
    12345$
    #    ^ prompt here
    
    $ seq 5 | awk '{printf "%s", $0} END {print ""}'
    12345
    

    【讨论】:

      【解决方案4】:

      一种方式

      awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
      

      【讨论】:

      • 次要注意:永远不要使用printf $0,因为$0 可能包含%F 等字符串...跟随很容易失败(至少对于GAWK 3.1.5):echo "%F"|awk '{printf $0}'。请改用printf "%s",$0
      【解决方案5】:

      您可以像这样简单地动态使用 ORS:

      awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in &gt; file_out

      【讨论】:

        【解决方案6】:

        如果 Perl 是一个选项,这里是一个使用 fedorqui 示例的解决方案:

        seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'

        说明:
        chomp 删除换行符
        print "$_ " 打印每一行,附加一个空格
        END{} 块用于打印换行符

        输出:1 2 3 4 5

        【讨论】:

          猜你喜欢
          • 2017-10-09
          • 2017-08-17
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-27
          • 1970-01-01
          相关资源
          最近更新 更多