[Linux] 用 awk 每 n 行擷取檔案

Tiffany Chen
82年生的蒂芬妮
4 min readJun 15, 2021
Image by OpenClipart-Vectors from Pixabay
Contents:
1. 前言:檔案太大了,想要每 n 行擷取檔案縮小檔案
2. 用 awk 每 n 行擷取檔案
3. 其他 awk 用法
(1) 擷取含指定字串的行數
(2) 擷取每行的第 n 個字串
(3) 印出指定欄位含指定字串的行數
4. 總結

1. 前言

情景:若現在有個檔案很大,想要每 n 行擷取檔案來縮小檔案大小,在 Linux 可以怎麼做呢?

Solution:用awk 'NR % n == 0' file.txt > file_out.txt 指令每 n 行擷取檔案

2. 用 awk 每 n 行擷取檔案

用 10 行的檔案為例,看看 awk 怎麼每 n 行擷取檔案吧!

file.txt
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

下指令 awk 'NR % 3 == 0' file.txt > file_out.txt,每 3 行輸出 file.txt 的內容至 file_out.txt,結果如下,成功輸出第 3、6、9 行至另一個檔案啦!

範例:從 file.txt 每 3 行輸出至 file_out.txt

3. 其他 awk 用法

General form:awk [option] 'selection_criteria' input_file > output_file

承接上面的範例 file.txt,來看看其他 awk 處理檔案的用法吧!

(1) 擷取含指定字串的行數

command: awk '/字串/' file.txt

範例:擷取含 “line 1” 的行數

(2) 擷取每行的第 n 個字串

預設用空白切割字串,$0代表整行,$1、$2、$3依序為以空白切割的字串。
command: awk '{print $列數}' file.txt

範例:擷取每行以空白切割的第二個字串

(3) 印出指定欄位含指定字串的行數

command: awk '{ if($列數 == "字串") print $0 }' file.txt

範例:印出第二個欄位出現 “2” 的行數

4. 總結

當對一個檔案想要切割、擷取行數,可以想到 awkgrep 也是在 Linux 常用來擷取檔案的指令(ref: grep 指令實用技巧),除了上面提到的幾個範例,awk 還有一些內建的好用變數可以使用(ref: awk裡好用的變數:FS, OFS, RS, ORS, NR, NF, FILENAME, FNR),下次若要處理檔案的話,不妨可以想到實用的 awk

小知識:awk 的取名是來自於三個作者的名字縮寫-Aho, Weinberger, and Kernighan。

Reference

-2021.06.15。

--

--

Tiffany Chen
82年生的蒂芬妮

Graphics Software Engineer @ MD。白天是名軟體工程師,晚上偶爾寫寫 blog,2021年秋天搬至美國亞利桑那州居住,記錄AZ新鮮人的日常生活&軟體工程筆記。現居MD。