カテゴリー
【Head/Tail/Cut/Trコマンド活用】CSVデータから効率で高速に行&列の範囲を絞り出す方法
※ 当ページには【広告/PR】を含む場合があります。
2021/04/09
はじめに
HeadとTail
cat
headコマンドの使い方
$ cat <<EOF > hoge.csv
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
上岡ムメ美,営業部,本社,23年
京谷マハ次,製造部,山口工場,3年
園田フマ由,人事部,本社,17年
田川ポゥ子,製造部,ベトナム工場,12年
満田クタ郎,営業部,本社,2年
島寺ルン大,営業部,本社,18年
香下ウル蔵,製造部,山口工場,5年
蒲田ウオ奈,海外部,メキシコ支部,9年
郷田ポポ生,営業部,名古屋支部,4年
梅岡ボル伍,経理部,本社,25年
亀川ヲル士,製造部,山口工場,14年
EOF
head
#👇-nオプションで先頭から指定の行数の長さを出力
$ head -n 5 hoge.csv
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
#👇-nオプションで負の行数を指定すると最後から指定の行数を
#👇遡った位置までの行を全て表示
$ head -n -11 hoge.csv
山下モゲ雄,営業部,本社,3年
島田フガ子,経理部,名古屋支部,15年
岡田ピポ太,製造部,山口工場,8年
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
tailコマンドの使い方
#👇-nオプションで最後から指定の行数の長さを遡って出力
$ tail -n 5 hoge.csv
香下ウル蔵,製造部,山口工場,5年
蒲田ウオ奈,海外部,メキシコ支部,9年
郷田ポポ生,営業部,名古屋支部,4年
梅岡ボル伍,経理部,本社,25年
亀川ヲル士,製造部,山口工場,14年
#👇-nオプションで'+行数'で指定すると先頭から指定の行数番目
#👇以降の位置から最後までの行を出力
$ tail -n +11 hoge.csv
島寺ルン大,営業部,本社,18年
香下ウル蔵,製造部,山口工場,5年
蒲田ウオ奈,海外部,メキシコ支部,9年
郷田ポポ生,営業部,名古屋支部,4年
梅岡ボル伍,経理部,本社,25年
亀川ヲル士,製造部,山口工場,14年
+
+
行の範囲取り出し
#👇4~7行目のデータの範囲取り出し
$ head -n 7 hoge.csv | tail -n +4
沢口モフ代,人事部,本社,4年
銭形ガメ吉,海外部,メキシコ支部,11年
上岡ムメ美,営業部,本社,23年
京谷マハ次,製造部,山口工場,3年
Cutによるcsvデータの部分列分割
#👇1列目と4列目の取り出し
$ cut -f 1,4 -d "," hoge.csv
山下モゲ雄,3年
島田フガ子,15年
岡田ピポ太,8年
#...中略
亀川ヲル士,14年
#👇-fオプションでは取り出し列リストの順番を変えても
#👇出力される列の順序は変わらない
$ cut -f 4,2,1 -d "," hoge.csv
山下モゲ雄,営業部,3年
島田フガ子,経理部,15年
岡田ピポ太,製造部,8年
#...中略
亀川ヲル士,製造部,14年
部分Csvデータの取り出し
$ head -n 8 hoge.csv | tail -n +3 | cut -f 1,3 -d ","
岡田ピポ太,山口工場
沢口モフ代,本社
銭形ガメ吉,メキシコ支部
上岡ムメ美,本社
京谷マハ次,山口工場
園田フマ由,本社
セル内文字列の置換・削除
#👇区切り文字の,を&に変える
$ head -n 8 hoge.csv | tail -n +3 | cut -f 1,2,3 -d "," | tr , \&
岡田ピポ太&製造部&山口工場
沢口モフ代&人事部&本社
銭形ガメ吉&海外部&メキシコ支部
上岡ムメ美&営業部&本社
京谷マハ次&製造部&山口工場
園田フマ由&人事部&本社
#👇-dオプションで一括削除
$ head -n 8 hoge.csv | tail -n +3 | cut -f 1,2 -d "," | tr -d ,
岡田ピポ太製造部
沢口モフ代人事部
銭形ガメ吉海外部
上岡ムメ美営業部
京谷マハ次製造部
園田フマ由人事部
#👇POSIXキャラクタも指定できる(例では句読点文字をスペース文字'\ 'に置換)
$ head -n 8 hoge.csv | tail -n +3 | cut -f 1,2,3 -d "," | tr '[:punct:]' \
岡田ピポ太 製造部 山口工場
沢口モフ代 人事部 本社
銭形ガメ吉 海外部 メキシコ支部
上岡ムメ美 営業部 本社
京谷マハ次 製造部 山口工場
園田フマ由 人事部 本社
$ head -n 8 hoge.csv | tail -n +3 | cut -f 1,2 -d "," | tr -d 部
岡田��太,製��
沢口��代,人事
��形ガ�吉,海外
上岡��美,営業
京谷��次,製��
園田��由,人事
実践編〜巨大なCsvファイルを効率的に処理するスクリプト
#!/bin/bash
FILE_NAME=hoge.csv
TOTAL_LINES=$(wc -l hoge.csv | cut -d' ' -f1)
#👇本番ではバッファサイズは大きく変更
BUFFER_SIZE=3
START_READ=1
END_READ=$(($TOTAL_LINES / $BUFFER_SIZE))
LEFT_LINES=$(($TOTAL_LINES % $BUFFER_SIZE))
#👇1と3列目の取り出す例
COLUMN_LIST=1,3
echo "TOTAL:${TOTAL_LINES} START:${START_READ} END:${END_READ} LEFT:${LEFT_LINES}"
do_something() {
#DO SOMETHING...
echo "$1"
}
for i in $(seq "$END_READ" -1 0); do
while read LINE; do
do_something $LINE
done< <(
if [ "$i" != 0 ] ; then
#👇バッファサイズ毎にバッチ処理
head -n "$(( ($END_READ - $i + 1) * $BUFFER_SIZE ))" $FILE_NAME |
tail -n "$(( $BUFFER_SIZE ))" |
cut -f "$COLUMN_LIST" -d ","
else
#👇最後に余ったバッチのための処理
tail -n "$(( $LEFT_LINES ))" $FILE_NAME |
cut -f "$COLUMN_LIST" -d ","
fi
)
done
$ chmod +x hoge.sh
$ ./hoge.sh
#👇結果
TOTAL:16 START:1 END:5 LEFT:1
山下モゲ雄,本社
島田フガ子,名古屋支部
岡田ピポ太,山口工場
沢口モフ代,本社
銭形ガメ吉,メキシコ支部
上岡ムメ美,本社
京谷マハ次,山口工場
園田フマ由,本社
田川ポゥ子,ベトナム工場
満田クタ郎,本社
島寺ルン大,本社
香下ウル蔵,山口工場
蒲田ウオ奈,メキシコ支部
郷田ポポ生,名古屋支部
梅岡ボル伍,本社
亀川ヲル士,山口工場
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー