csv
bash スクリプトで 2 行目からファイルの最後までファイルの各行を読み取る方法を知りたいです。
bashでファイルを読み取る方法を知っています:
while read line
do
echo -e "$line\n"
done < file.csv
でも、2行目からファイルの最後まで読み込みたい。どうすればこれを達成できますか?
csv
bash スクリプトで 2 行目からファイルの最後までファイルの各行を読み取る方法を知りたいです。
bashでファイルを読み取る方法を知っています:
while read line
do
echo -e "$line\n"
done < file.csv
でも、2行目からファイルの最後まで読み込みたい。どうすればこれを達成できますか?
tail -n +2 file.csv
マニュアルページから:
-n, --lines=N
output the last N lines, instead of the last 10
...
If the first character of N (the number of bytes or lines) is a '+',
print beginning with the Nth item from the start of each file, other-
wise, print the last N items in the file.
英語では、これは次のことを意味します。
tail -n 100
最後の 100 行を出力します
tail -n +100
100行目から始まるすべての行を印刷します
以下の単純なソリューションsed
:
sed -n '2,$p' <thefile
どこ2
から読みたい行の番号です。
または(純粋なbash)...
{ for ((i=1;i--;));do read;done;while read line;do echo $line;done } < file.csv
より良い書き方:
linesToSkip=1
{
for ((i=$linesToSkip;i--;)) ;do
read
done
while read line ;do
echo $line
done
} < file.csv
これは、linesToSkip == 0 または linesToSkip > file.csv の行数の場合でも機能します
編集:
gniourf_gniourf が検討するように私に命じたように変更されました: 最初の構文は sub-shell を生成しますが、()
そうではありません。{}
{}
もちろん、(元の質問のタイトルとして)1行だけスキップするには、ループを次のfor (i=1;i--;));do read;done
ように単純に置き換えることができますread
:
{ read;while read line;do echo $line;done } < file.csv
行で何をしたいかにもよりますが、選択した各行を配列に保存したい場合、最良の選択は間違いなくビルトインmapfile
です:
numberoflinestoskip=1
mapfile -s $numberoflinestoskip -t linesarray < file
は、2 行目から始まるファイルの各行をfile
配列に格納しlinesarray
ます。
help mapfile
詳細については。
各行を配列に格納したくない場合は、他の非常に良い答えがあります。
F. Hauri がコメントで示唆しているように、これはファイル全体をメモリに保存する必要がある場合にのみ適用されます。
それ以外の場合、最善の策は次のとおりです。
{
read; # Just a scratch read to get rid (pun!) of the first line
while read line; do
echo "$line"
done
} < file.csv
注意: サブシェルは必要ありません。
これには多くの解決策があります。私のお気に入りの1つは次のとおりです。
(head -2 > /dev/null; whatever_you_want_to_do) < file.txt
tail
必要な行をスキップするために使用することもできます:
tail -n +2 file.txt | whatever_you_want_to_do
これはうまくいきます
i=1
while read line
do
test $i -eq 1 && ((i=i+1)) && continue
echo -e "$line\n"
done < file.csv
変数を取得するだけです。
#!/bin/bash
i=0
while read line
do
if [ $i != 0 ]; then
echo -e $line
fi
i=$i+1
done < "file.csv"
UPDATE$i
上記は、csvのすべての行で変数をチェックします。したがって、数百万行の非常に大きな csv ファイルがある場合、かなりの量の CPU サイクルが消費され、母なる自然には適していません。
次の 1 つのライナーを使用して、CSV ファイルの最初の行を削除しsed
、残りのファイルをwhile
ループに出力できます。
sed 1d file.csv | while read d; do echo $d; done