22

bash を使用してテキスト ファイルから n 文字を読み取る方法に関するこの質問を読みました。次のようなファイルから一度に単語を読み取る方法を知りたいです。

example text
example1 text1
example2 text2
example3 text3

誰かが私にそれを説明したり、簡単な例を示したりできますか? ありがとう!

4

8 に答える 8

22

コマンドはreadデフォルトで行全体を読み取ります。したがって、解決策はおそらく行全体を読み取ってから、次のように空白で分割することforです。

#!/bin/sh

while read line; do
    for word in $line; do
        echo "word = '$word'"
    done
done <"myfile.txt"
于 2012-06-07T12:42:50.860 に答える
21

標準入力でこれを行う方法は、-aフラグを read に渡すことです。

read -a words
echo "${words[@]}"

これにより、行全体がインデックス付き配列変数 (この場合はwords ) に読み込まれます。その後、シェル パラメーター展開を使用して、単語に対して任意の配列操作を実行できます。

ファイル指向の操作の場合、現在のバージョンの Bash は組み込みの mapfile もサポートしています。例えば:

mapfile < /etc/passwd
echo ${MAPFILE[0]}

いずれにせよ、配列は進むべき道です。この機能を最大限に活用するために、時間をかけてBash 配列構文に慣れることは価値があります。

于 2012-06-07T12:53:10.383 に答える
13

通常、while read -r lineループを使用してファイルから読み取る必要があります。forこれを実行して行の単語を解析するには、ループ内にループをネストする必要がありwhileます。

ネストされたループを必要とせずに機能する手法を次に示します。

for word in $(<inputfile)
do
    echo "$word"
done
于 2012-06-07T16:59:34.870 に答える
1

スペースまたは改行でxargs区切られた単語を組み合わせて、 1 行に 1 つ出力することができます。echo

<some-file xargs -n1 echo

some-command | xargs -n1 echo

これは、入力全体を一度に読み取る必要がないため、大量または低速のデータ ストリームにも適しています。

これを使用して、テーブル名を列レイアウトに出力する SQLite から一度に 1 つのテーブル名を読み取りました。

sqlite3 db.sqlite .tables | xargs -n1 echo | while read table; do echo "1 table: $table"; done
于 2020-12-22T19:18:25.183 に答える