web-dev-qa-db-ja.com

テキストファイルから一度に1行のみを印刷する

テキストファイルからWordのみを一度に印刷または表示するにはどうすればよいですか。スクリプトを実行すると、テキストファイルの各Wordが1つずつ表示されますが、そのWordのみが表示されます。

これは私がやったことですが、各Wordを別々の行に表示しますが、すべてを表示します:

FS=$'\n'      
for j in `cat read`
do
    echo "$j"
done

出力は次のようになります。

root@matrix:~> first Word  ---> this Word disappear when second is displayed
root@matrix:~> second Word ---> this disappear when third is displayed
root@matrix:~> third Word  ---> this disappear when fourth is displayed and continues like this to the end of the file!
5
Hassen Fatima

次のように、スクリプトでsleepおよびclearコマンドを使用できます。

for Word in $(< read)
do
    echo "$Word"
    sleep 1
    clear
done

説明:

sleepコマンドは、指定された時間(秒単位)遅延します。 sleep 1の場合、遅延は1秒間になります。 2番目のパラメーターをインクリメントするか、1秒未満の遅延で低い単位に分割することにより、より多くの時間遅延を変更できます。 sleep .1が1/10秒の遅延の場合、またはsleep .001が1/1000秒の遅延の場合など。

clearコマンドは、端末画面をクリアします。

以下のawkコマンドを使用してこれを実行できます。

awk '{i=1; while(i<=NF){ print $((i++)); system("sleep 1; clear") }}' read

説明:

awkNFは、現在の入力レコード/行でフィールドの総数を指定するため、変数をカウンターとして使用することで(i)およびそれをループして、それらのすべてを最初の位置から最後まで印刷します(NF)。次に、system("sleep 1; clear")部分を使用して、awkにシステムコマンドを呼び出して1秒間スリープさせ、画面をクリアするように指示しています。


上記では、入力ファイルをWord by Wordとして表示しています。行ごとに表示する場合は、次のようにスクリプトにIFS=$'\n'を追加します。

IFS=$'\n'
for Word in $(< read)
do
    echo "$Word"
    sleep 1
    clear
done

awkコマンドを次のように変更します。

awk '{ $0; system("sleep 1; clear") }1' read
  • $0は現在の行を指定します。そして、最後の1は、デフォルトのawkprintコマンドを有効にします。
4
αғsнιη

bashを使用して、次のことを行います。

while IFS=$'\n' read -r line
do
    printf "%-${COLUMNS}s\r" "$line"
    sleep 1
done < file

改行(\r)の代わりに復帰(\n)を使用すると、現在の行を上書きできます。 -${COLUMNS}は、前の行が完全に上書きされるように、出力にスペースを埋め込みます。

Wordごとのソリューションでは、二重ループが必要だと思います。

while read -ra line
do 
    for Word in "${line[@]}"
    do
        printf "%-${COLUMNS}s\r" "$Word"
        sleep 1
    done
done < file
4
muru