テキストを整形する

INPUT · スライド

横に並べる、行番号を振る(`paste` と `nl`)

01 / 06

今度は「横」につなぐ

ここまでの道具を思い出してみて。

  • grep … 要るを選ぶ(横に切る)
  • cut … 要るを抜く(縦に切る)
  • sortuniq … 行を並べかえる、まとめる

どれも減らす・並べかえる道具だったね。

この回は逆向きだよ。別々のファイルを横につなぐ paste と、行番号を足す nl を扱うんだ。減らすのではなく、増やす向きの道具だよ。

02 / 06

paste は行どうしを横につなぐ

paste は2つ以上のファイルを、同じ行番号どうしで横に並べるよ。

~ $ paste namae.txt tensuu.txttanaka  80suzuki  95sato    72

名前のファイルと点数のファイルが、1行ずつ組になったね。

区切りはタブが既定だよ。-d で変えられるので、CSV を作りたいならこうだね。

paste -d, namae.txt tensuu.txt

cat namae.txt tensuu.txt だと縦に6行つながってしまうのを思い出して。cat は縦、paste は横だよ。

~ $ paste -d, namae.txt tensuu.txttanaka,80suzuki,95sato,72

03 / 06

-s で縦を横にする

-s(serial)を付けると、1つのファイルの全部の行を1行にまとめるよ。

~ $ paste -s -d, namae.txttanaka,suzuki,sato

縦に並んでいたものが横1行になったね。

前のレッスンで tr を使って「横のものを縦にした」よね。paste -s はその逆向きだよ。

やりたいこと道具
横 → 縦tr ' ' '\n'
縦 → 横paste -s -d' '

この2つを覚えておくと、データの向きを自由に変えられるようになるよ。

04 / 06

nl で行番号を振る

nl(number lines)は各行の頭に行番号を付けるよ。

nl namae.txt

番号の幅や区切りは変えられるよ。既定だと右そろえで見にくいので、こう書くと読みやすいんだ。

nl -w1 -s': ' namae.txt
  • -w1 … 番号の幅を1桁分に(余分な空白を入れない)
  • -s': ' … 番号のあとに : を置く

他にも -v10 で10番から始めたり、-i5 で5ずつ増やしたりできるよ。

~ $ nl -w1 -s': ' namae.txt1: tanaka2: suzuki3: sato

05 / 06

nlcat -n の違い

行番号を振る方法はもう1つあるよ。cat -n だね。でも結果が違うんだ

kara.txtaaa・空行・bbb の3行だよ。

~ $ nl kara.txt     1  aaa     2  bbb~ $ cat -n kara.txt     1  aaa     2     3  bbb

nl は空行を数えないんだ。cat -n は数えるよ。

どちらが欲しいかは場面によるね。

  • 文章に番号を振る(空行は飾りなので数えたくない) → nl
  • ファイルの何行目かを知りたい(実際の行番号が欲しい) → cat -n

nl -ba と書けば nl でも空行を数えるようになるよ(b は body、a は all だね)。

06 / 06

さあ、打ってみよう

ファイルは3つだよ。

  • namae.txttanakasuzukisato
  • tensuu.txt809572
  • kara.txtaaa・空行・bbb

namae.txttensuu.txt行の順番が対応しているよ。1行目どうし(tanaka80)が組だね。

paste は行の順番だけを見て組にするので、順番が合っていないと間違った組ができる。使う前に両方のファイルを cat で見て、順番が合っているか確かめる癖をつけてね。