gpt4 book ai didi

linux - 在 grep 之后在同一行打印 awk 输出

转载 作者:太空宇宙 更新时间:2023-11-04 09:11:58 24 4
gpt4 key购买 nike

我有一个非常粗糙的脚本 getinfo.sh,它从所有子文件夹中名称为 FILENAME1 和 FILENAME2 的所有文件以及子文件夹的路径中获取信息。如果使用 "getinfo.sh n" 调用脚本,awk 结果应该只从 FILENAME2 中选取第 n 行。我要将所有信息打印在一行中!

问题是,如果我使用 print 而不是 printf,信息将写入一个新行,但我的脚本可以正常工作。如果我使用 printf,我可以在脚本完成后在命令提示中看到 awk 命令的最后一位,但在同一行中的 grep 命令之后它不是 paset。总而言之,完整的行会很长,但这是故意的。你愿意告诉我我做错了什么吗?

#!/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')

最佳答案

您在评论中说得更清楚了。

I want the output of printf '%q' "${PWD##*/}" and grep 'Search_term ' FILENAME1 | tail -1 and awk '{ if(NR==n) printf "%s",$0 }' n=$1 $2 FILENAME2 to be printed in one line

首先,我们有三个命令,每个命令打印一行输出。由于命令无关紧要,让我们将它们包装在函数中以简化答案:

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

要在它们之间不换行地打印它们,我们可以:

  1. 使用命令替换,删除尾随的空换行符。一些 printf:

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

    或者一些 echo :

    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

If i do not pass a number the awk command should be omited.

我看到您的 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

对于您要处理的每种情况都类似。记住正确的引用。

关于linux - 在 grep 之后在同一行打印 awk 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54438879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com