簡體   English   中英

grep后在同一行中打印awk輸出

[英]Printing awk output in same line after grep

我有一個非常粗糙的腳本getinfo.sh,它可以從所有子文件夾及其子路徑中所有名為FILENAME1和FILENAME2的文件中獲取信息。 如果使用“ getinfo.sh n”調用腳本,則awk結果應僅從FILENAME2中選擇第n行。 我希望所有信息都打印在一行中!

問題是,如果我使用print而不是printf,信息將寫入新行,但是我的腳本有效。 如果我使用printf,腳本執行完后,我可以在命令屬性中看到awk命令的最后一位,但是在同一行中的grep命令之后卻沒有設置。 總的來說,完整的行很長,但這是有意的。 您願意告訴我我做錯了什么嗎?

#!/bin/bash

IFS=$'\n'
while read -r fname ;
do
    pushd $(dirname "${fname}") > /dev/null
    printf '%q' "${PWD##*/}"
    grep 'Search_term ' FILENAME1 | tail -1
    awk '{ if(NR==n) printf "%s",$0 }' n=$1 $2 FILENAME2
    popd > /dev/null
done < <(find . -type f -name 'FILENAME1')

如果這更容易,我也很樂意grep第n行?

解:

#!/bin/bash

IFS=$'\n'
while read -r fname ;
do
    pushd $(dirname "${fname}") > /dev/null
   {
     printf '%q' "${PWD##*/}"
     grep 'Search_term' FILENAME1 | tail -1
   } | tr -d '\n'

   if [ "$1" -eq "$1" ] 2>/dev/null
   then
        awk '{ if(NR==n) printf "%s",$0 }' n="$1" FILENAME2
   fi

    printf "\n"
    popd > /dev/null
done < <(find . -type f -name 'FILENAME1')

您在評論中更清楚了。

我想要輸出printf'%q'“ $ {PWD ## * /}”和grep'Search_term'FILENAME1 | 尾巴-1和awk'{if(NR == n)printf“%s”,$ 0}'n = $ 1 $ 2 FILENAME2將在一行中打印

因此,首先,我們有三個命令,每個命令打印一行輸出。 由於這些命令無關緊要,讓我們將它們包裝在函數中以簡化答案:

cmd1() { printf '%q\n' "${PWD##*/}"; }
cmd2() { grep .... ; }
cmd3() { awk ....; }

要打印它們之間沒有換行符,我們可以:

  1. 使用命令替換,該命令刪除尾隨的空換行符。 帶有一些printf:

     printf "%s%s%s\\n" "$(cmd1)" "$(cmd2)" "$(cmd3)" 

    或一些回聲:

     echo "$(cmd1) $(cmd2) $(cmd3)" 

    或附加到變量:

     str="$(cmd1)" str+=" $(cmd2)" str+=" $(cmd3)" printf" %s\\n" "$str" 

    等等。

  2. 我們可以使用tr -d '\\n'從流中刪除換行符:

     { cmd1 cmd2 cmd3 } | tr -d '\\n' echo # newlines were removed, so add one to the end. 

    或者我們也可以只從前n-1命令中刪除換行符,但是我認為這不太可讀:

     { cmd1 cmd2 } | tr -d'\\n' cmd3 # the trailing newline will be added by cmd3 

如果我沒有傳遞數字,則應該省略awk命令。

我看到您的awk命令同時擴展了$1$2 ,並且我只看到$1作為n=$1環境變量傳遞給awk 我不知道$2是多少。 您可以在$#的值上寫if-s參數的數量:

if (($# == 2)); then
    awk '{ if(NR==n) printf "%s",$0 }' n="$1" "$2" FILENAME2
fi

對於您要處理的每種情況也是如此。 記住正確的報價。

您的命令顯示未使用的參數$2 ,我刪除了該參數。
您可以使用END塊在awk的末尾添加換行符,但是在調用沒有行號的腳本時還需要一個額外的換行符。 echo會做。

#!/bin/bash

IFS=$'\n'
while read -r fname ;
do
   pushd $(dirname "${fname}") > /dev/null
   # Add result of grep in same printf statement
   printf '%s %s' "${PWD##*/}" "$(grep 'Search_term ' FILENAME1 | tail -1)"
   if (( $# -eq 1 )); then
      # use $1 as an awk variable, number n
      # use $2 as a different file to read from
      awk -v n=$1 '{ if(NR==n) printf "%s ",$0 }' FILENAME2
   fi
   # Add line-ending
   echo
   popd > /dev/null
done < <(find . -type f -name 'FILENAME1')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM