bash を使用してテキスト ファイルから n 文字を読み取る方法に関するこの質問を読みました。次のようなファイルから一度に単語を読み取る方法を知りたいです。
example text
example1 text1
example2 text2
example3 text3
誰かが私にそれを説明したり、簡単な例を示したりできますか? ありがとう!
コマンドはread
デフォルトで行全体を読み取ります。したがって、解決策はおそらく行全体を読み取ってから、次のように空白で分割することfor
です。
#!/bin/sh
while read line; do
for word in $line; do
echo "word = '$word'"
done
done <"myfile.txt"
標準入力でこれを行う方法は、-a
フラグを read に渡すことです。
read -a words
echo "${words[@]}"
これにより、行全体がインデックス付き配列変数 (この場合はwords ) に読み込まれます。その後、シェル パラメーター展開を使用して、単語に対して任意の配列操作を実行できます。
ファイル指向の操作の場合、現在のバージョンの Bash は組み込みの mapfile もサポートしています。例えば:
mapfile < /etc/passwd
echo ${MAPFILE[0]}
いずれにせよ、配列は進むべき道です。この機能を最大限に活用するために、時間をかけてBash 配列構文に慣れることは価値があります。
通常、while read -r line
ループを使用してファイルから読み取る必要があります。for
これを実行して行の単語を解析するには、ループ内にループをネストする必要がありwhile
ます。
ネストされたループを必要とせずに機能する手法を次に示します。
for word in $(<inputfile)
do
echo "$word"
done
スペースまたは改行で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