Bash 是否可以在管道中设置变量?

Bash 是否可以在管道中设置变量?,bash,variables,pipeline,Bash,Variables,Pipeline,我有一个大的txt文件,我想在管道中编辑。但在管道中的同一个地方,我想设置变量$nol中的行数。我只想看看sintax如何在管道中设置变量,如: cat ${!#} | tr ' ' '\n'| grep . ; $nol=wc -l | sort | uniq -c ... 在第二个管道之后这样做是非常错误的,但是我如何在bash中这样做呢 解决办法之一是: nol=$(cat ${!#} | tr ' ' '\n'| grep . | wc -l) pipeline all from

我有一个大的txt文件,我想在管道中编辑。但在管道中的同一个地方,我想设置变量$nol中的行数。我只想看看sintax如何在管道中设置变量,如:

  cat ${!#} | tr ' ' '\n'| grep . ; $nol=wc -l | sort | uniq -c ...
在第二个管道之后这样做是非常错误的,但是我如何在bash中这样做呢

解决办法之一是:

nol=$(cat ${!#} | tr ' ' '\n'| grep . | wc -l)
pipeline all from the start again
但我不想把同一件事写两遍,因为我这里有更多的管道


我不使用awk或sed…

您可以在管道的特定链接中设置变量,但这不是很有用,因为只有特定链接会受到它的影响

我建议只使用临时文件

set -e
trap 'rm -f "$tmpf"' EXIT
tmpf=`mktemp`
cat ${!#} | tr ' ' '\n'| grep . | sort > "$tmpf"
nol="$(wc "$tmpf")"
< "$tmpf" uniq -c ...
set-e
陷阱“rm-f”$tmpf“退出
tmpf=`mktemp`
猫${!}tr''\n'| grep.|排序>“$tmpf”
nol=“$(wc“$tmpf”)”
<“$tmpf”uniq-c。。。

您可以避免使用带有tee和命名管道的临时文件,但它的性能可能不会更好(甚至可能更差)。

在我看来,您是在问如何避免在文件中重复两次,只是为了获得字数和行数

Bash允许您读取变量,
wc
可以一次生成所需的所有数字

NAME
     wc -- word, line, character, and byte count
所以首先

read words line chars < <( wc < ${!#} )
这与第一个命令行的字数明显不同,因此不能使用单个
wc
实例同时生成这两个命令行。相反,一个选项可能是将您的功能放入一个同时执行两个功能的脚本中:

read words uniques < <(
awk '
      {
        words += NF
        for (i=1; i<=NF; i++) { unique[$i] }
      }
      END {
        print words,length(unique)
      }
    ' ${!#}
)

读取单词uniques<您可以使用
tee
然后将其写入您稍后使用的文件:

tempfile="xyz"
tr ' ' '\n' < "${!#}" | grep '.' | tee > "$tempfile" | sort | uniq -c ...
nol=$(wc -l "$tempfile")
tempfile=“xyz”
tr''.\n'<“${!#}”| grep'.| tee>“$tempfile”| sort | uniq-c。。。
nol=$(wc-l“$tempfile”)
或者你也可以用另一种方式:

nol=$(tr ' ' '\n' < "${!#}" | grep '.' \
  | tee >(sort | uniq -c ... > /dev/tty) | wc -l
nol=$(tr''.\n'<“${!#}”| grep'\
|tee>(排序| uniq-c…>/dev/tty)| wc-l

更新:

花了一分钟,但我明白了

cat ${!#} | tr ' ' '\n'| tee >(nol=$(wc -l)) | sort | uniq -c ...
上一篇:

我能想到的唯一方法是存储在变量中并调用。您不会多次执行该命令。您只需将输出存储在变量中即可

aCommand=($(cat ${!#} | tr ' ' '\n'));sLineCount=$(echo ${#aCommand[@]});echo ${aCommand[@]} | sort | uniq -c ...
  • aCommand将在数组中存储第一组命令的结果
  • sLineCount将对数组中的元素(行)进行计数
  • ;…回显数组元素并从那里继续执行命令

你到底想做什么?对我来说,awk
似乎可以一次性完成。我不想使用awk或sed。不过:也许只有Bash一个人可以处理。试着给出一个大局图,因为你的问题是相当局部的,可能隐藏了一些概念问题。而且,它看起来像是将输出存储到某个特定的管道中n一个变量可以完成。然后,计算行数并将echo plus管道连接到其余命令。
|grep;
这个分号是故意的吗?Marta,我们仍然需要更多信息来了解您的操作步骤。尝试演示您遇到的问题,并包括一个输入示例以及预期的输出你是这个意思吗?
aCommand=($(cat ${!#} | tr ' ' '\n'));sLineCount=$(echo ${#aCommand[@]});echo ${aCommand[@]} | sort | uniq -c ...