0

単語統計を含む行を超えてファイル内のすべてを印刷したい -

今私がやろうとしていることは -

$a=sed -n '/Stats/=' file.txt | sed -n '$a,$p' file.txt

もちろん、上記の提案された方法では機能しませんが、他に何をすべきですか?

たとえば、単語が行番号であるとします。40 では、41 行目から最後まですべてを印刷したいと思います。

変数をパイプの一方の側から他方の側に渡す方法を教えてください。また、誰かが他の方法でそれを行うことができれば、それは大きな助けになるでしょう.

ありがとう

4

3 に答える 3

1

Linux パイプの片側から別の側に変数を直接渡すことはできません。これは、パイプの両側のコマンドがfork()ed サブシェルで実行されるためです。つまり、これらのコマンドは、親シェル プロセスの独自のコピー (パイプの両側に 1 つ) で実行されます。したがって、親プロセスの変数のコピーを受け取りますが、親プロセスの元の変数を直接変更することはできません。したがって、パイプの両側のサブシェル内の変数のコピーは、親から同じ初期値を継承する必要があるという事実を除いて、互いに完全に独立しています。

これを説明するために、次のコマンドを実行できます。

a=100
(echo "LHS pre: $a" 1>&2; ((a++)); echo "LHS post: $a" 1>&2) | ( echo "RHS pre: $a" 1>&2 ; ((a+=10)); echo "RHS post: $a" 1>&2 )
echo "Parent final: $a" 1>&2

出力は次のとおりです。

RHS pre: 100
RHS post: 110
LHS pre: 100
LHS post: 101
Parent final: 100

ここではa、親シェル プロセスで変数を 100 に設定します。2 番目のコマンドのパイプの LHS と RHS (左側と右側) は両方とも、この変数のコピーを受け取ります。LHS は copy 変数を出力し、それを 1 ずつ増やしてから、再度出力します。RHS は copy 変数を出力し、それを 10 ずつ増やしてから、再度出力します。次に、親シェルは元のバージョンの変数を出力します。LHS サブシェルと RHS サブシェルが変数のコピーを完全に独立してインクリメントしていることがわかります。また、親のオリジナルは、LHS および RHS サブシェルからの変更の影響をまったく受けていないこともわかります。


これで理論は終わりです。実際に直面している問題の解決策をいくつか紹介します。それほど洗練されていないかもしれませんが、のマンページを読むことを避けるためにできる限りのことをしている私たちのために、いくつかの代替手段があります:

  1. 「シンプルな」ツール - headtailgrepおよびcut
  2. 純粋な

.

ubuntu@ubuntu:~$ cat stats.txt 
The first line
The 2nd line
the line with stats in it
another line
another line with stats
another line
the last line
ubuntu@ubuntu:~$ tail -n-$(($(grep -n stats stats.txt | head -n1 | cut -d: -f1)+1)) stats.txt 
another line
another line with stats
another line
the last line
ubuntu@ubuntu:~$ fl=""; while read -r line; do [ "$fl" ] && echo -e $line; [[ $line =~ stats ]] && fl=1; done < stats.txt
another line
another line with stats
another line
the last line
于 2013-10-26T04:34:49.843 に答える
1

Another awk solution

awk '/Stats/ {f=1} f' file

When word Stats is found, set flag f to true.
If f is true, do default action, print the line, same as {print $0}

于 2013-10-26T07:20:48.027 に答える