ファイルから 1 行を取得する方法は?
file.txt
"aaaaaaa"
"bbbbbbb"
"ccccccc"
"ddddddd"
行 3 (「cccccccc」) を取得する必要があります。ありがとうございます。
ファイルから 1 行を取得する方法は?
file.txt
"aaaaaaa"
"bbbbbbb"
"ccccccc"
"ddddddd"
行 3 (「cccccccc」) を取得する必要があります。ありがとうございます。
sed
あなたの友達です。sed -n 3p
3 行目を印刷します ( -n
: 自動印刷なし、3p
: 行番号が 3 の場合に印刷)。sed -n 3,10p
たとえば、3 行目から 10 行目を印刷するなど、より複雑なパターンを作成することもできます。
ファイルが非常に大きい場合は、ファイル全体を循環するのではなく、印刷後に終了することを検討してください。sed -n '3{p;q}'
3行目が必要であることがわかっている場合、1つのアプローチはhead
、最初の3行tail
を取得し、これらの最後の行のみを取得するために使用することです。
varname="$(head -n 3 file.txt | tail -n 1)"
Bashビルトインのみを使用する別のアプローチは、read
3回呼び出すことです。
{ read ; read ; IFS= read -r varname } < file.txt
これを行う方法は次のawk
とおりです。
awk 'FNR==3 {print; exit}' file.txt
説明:
awk '...'
: ファイルを 1 行ずつ操作するためのツールである awk を呼び出します。一重引用符で囲まれた命令は awk によって実行されます。FNR==3 {print; exit}
: FNR は「ファイル番号レコード」の略です。「このファイルについてこれまでに読み取った行数」と考えてください。ここでは、ファイルの 3 行目にいる場合は、行全体を出力してすぐに awk を終了し、大きなファイルの残りの部分を読み取る時間を無駄にしないようにしています。file.txt
: 入力ファイルを引数として awk に指定し、cat を保存します。多くの可能性があります: 試してみてください:
sed '3!d' test
これは非常に高速なバージョンです。
sed "1d; 2d; 3q"
いつものように、他のすべての回答には些細で通常のものが含まれているため(パイプスルーgrep
then awk
then sed
then cut
or you-name-it
)、非常に珍しく(悲しいことに)あまり知られていないものです(したがって、私は最も独創的な回答を持っていると主張します):
mapfile -s2 -n3 -t < input.txt
echo "$MAPFILE"
これはかなり効率的だと思います (mapfile
非常に効率的で、bash ビルトインです)。
終わり!
bash 以外のツールは使用できますか? sed
bash を含むシステムでは、通常、およびawk
/またはその他の基本的なツールを見つけることができます。
$ line="$(sed -ne 3p input.txt)"
$ echo "$line"
また
$ read line < <(awk 'NR==3' input.txt)
$ echo "$line"
または、3行目を読んだ後に終了してこれを最適化したい場合:
$ read line < <(awk 'NR==3{print;nextfile}' input.txt)
$ echo "$line"
または、さらに単純なツールはどうですか (ただし、最適化されていません):
$ line="`head -n 3 input.txt | tail -n 1`"
$ echo "$line"
もちろん、これをすべて bash 内で実行したい場合は、外部ツールを使用せずにワンライナーにすることもできます。
$ for (( i=3 ; i-- ; )); do read line; done < input.txt
$ echo "$line"
同じことを達成する方法はたくさんあります。タスクに適したものを選択してください。次回は、全体的なニーズをもう少し詳しく説明してください。そうすれば、お客様の状況により適した回答を提供できます。
高速 bash バージョン。
while (( ${i:-1} <= 3 )); do
(( $i == 3 )) && read -r line; (( i++ ))
done < file.txt
出力
echo "$line" # Third line
"ccccccc"
説明
while (( ${i:-1} <= 3 ))
$i
-等しくなるまでカウントし、3
ループを終了します。(( $i == 3 ))
-$i
等しい場合は、3
読み取り行を実行します。read -r line
- ファイル行を variable に読み込みます$line
。(( i++ ))
-各ループでインクリメント$i
します。1
done < file.txt
- ファイルを while ループにパイプします。