0

私は非常に単純なことをしようとしていますが、私が望む方法でそれを解決すると、他の多くのコマンドにも役立ちます。

UNIX でファイルを 1 行ずつ読み取り、それらに対してコマンド (この場合は文字数) を実行したいと考えています。ファイル全体の場合、次を使用します。

wc -m

ただし、入力行ごとにこれが必要です。UNIXコマンドで操作するためにファイルを1行ずつストリーミングする最も簡単で最短の方法は何ですか? この状況では、行ごとに wc -m が必要ですが、将来のアプリケーションではまったく異なるコマンドが使用されるため、質問します。

あと、perlとawkは避けたい!これらのツールでこれを行う方法は既に知っていますが、別の方法を探しています。

ありがとう!

編集:他の質問へのリンクをありがとう, しかし、彼らの4つの答えを見た後, 私は私の正確な困惑に対する解決策がわかりません.

次の入力があるとします。

cat test.txt
    This is the first line.
    This is the second, longer line.
    This is short.
    My Final line that is much longer than the first couple of lines.

行ごとに読み取り、各行でコマンドを実行してすぐに結果を返すコードをプラグインしたいと思います。

wc -m各行で実行し、出力を返すコード:

23
32
14
65

cut -d " " -f 1または、各行で実行して出力を返すコード:

This
This
This
My

うまくいけば、これで物事が少し明確になります。ご提案いただきありがとうございます。

4

2 に答える 2

5

echo "${#line}"文字列の長さを知るために使用できます。でファイルを読み取るとwhile read...、残りは実行されます。

$ cat file
hello
my name
is fedor
qui


$ while read line; do echo "${#line}"; done < file
5
7
8
3
0

より良い形式で:

while read line
do
   echo "${#line}"
done < file
于 2013-06-21T15:43:58.963 に答える
1

行ごとの処理の最善の策はwhile readループですが、行を正確に保持するために使用するイディオムは次のとおりです。

while IFS= read -r line; do
    # process "$line"
done

使用しIFS=ないと、先頭の空白が失われます。使用read -rしないと、一部のバックスラッシュ シーケンスが bash によって解釈され、変数に逐語的に保持されないことを意味します。

あなたの悩みは言い換えることができると思います:

私はテキストの行を持っています。ファイルのように扱うにはどうすればよいですか?

bashには、それに答えることができる2つの機能があります

  1. wcstdin から読み取ることができるようなコマンドの場合は、 here-stringを使用します。

    wc -m <<< "$line"
    
  2. ファイルを必要とするコマンドの場合 (頭の中で考えられない)、プロセス置換を使用します。

    wc -m <(echo "$line")
    

例:

$ line="foo bar baz"
$ wc -m <<<"$line"
12
$ wc -m <(echo "$line")
12 /dev/fd/63

ps char カウントに暗黙的な末尾の改行が含まれていることに気付きました。それを削除するには、フォーマット文字列に改行を入れずに printf を使用します

$ wc -m <(printf %s "$line")
11 /dev/fd/63
$ wc -m < <(printf %s "$line")
11
于 2013-06-21T18:18:19.100 に答える