[英]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 ....; }
要打印它們之間沒有換行符,我們可以:
使用命令替換,該命令刪除尾隨的空換行符。 帶有一些printf:
printf "%s%s%s\\n" "$(cmd1)" "$(cmd2)" "$(cmd3)"
或一些回聲:
echo "$(cmd1) $(cmd2) $(cmd3)"
或附加到變量:
str="$(cmd1)" str+=" $(cmd2)" str+=" $(cmd3)" printf" %s\\n" "$str"
等等。
我們可以使用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.