Text-Processing
剪切命令未正確提取對齊列中的欄位
我有一個文本文件,我必須在其中剪切欄位 3、4、5 和 8:
219 432 4567 Harrison Joel M 4540 Accountant 09-12-1985 219 433 4587 Mitchell Barbara C 4541 Admin Asst 12-14-1995 219 433 3589 Olson Timothy H 4544 Supervisor 06-30-1983 219 433 4591 Moore Sarah H 4500 Dept Manager 08-01-1978 219 431 4527 Polk John S 4520 Accountant 09-22-1998 219 432 4567 Harrison Joel M 4540 Accountant 09-12-1985 219 432 1557 Harrison James M 4544 Supervisor 01-07-2000
由於預設分隔符是製表符,因此提取欄位的命令將是:
cut -f 3,4,5,8 filename
問題是輸出與原始文件內容相同。這裡發生了什麼?為什麼這不起作用?
並非所有列之間的空格看起來都是製表符,因此
cut
無法執行您想要的操作。我建議awk
改用。它比cut
解析數據列(例如您要完成的任務)更靈活:$ awk '{print $3,$4,$5,$8}' data.txt
例子
$ awk '{print $3,$4,$5,$8}' data.txt 4567 Harrison Joel Accountant 4587 Mitchell Barbara Admin 3589 Olson Timothy Supervisor 4591 Moore Sarah Dept 4527 Polk John Accountant 4567 Harrison Joel Accountant 1557 Harrison James Supervisor
您還可以使用以下
column
命令分隔輸出:$ awk '{print $3,$4,$5,$8}' data.txt |column -t 4567 Harrison Joel Accountant 4587 Mitchell Barbara Admin 3589 Olson Timothy Supervisor 4591 Moore Sarah Dept 4527 Polk John Accountant 4567 Harrison Joel Accountant 1557 Harrison James Supervisor
您也可以使用
awk
和來完成所有操作printf
:$ awk '{printf "%s\t%-20s\t%s\n",$3,$4" "$5,$8}' data.txt 4567 Harrison Joel Accountant 4587 Mitchell Barbara Admin 3589 Olson Timothy Supervisor 4591 Moore Sarah Dept 4527 Polk John Accountant 4567 Harrison Joel Accountant 1557 Harrison James Supervisor
重新審視
上述方法做得很好,但它們不處理任何在特定列的值中有空格的行。例如,帶有“Dept Manager”的行被截斷為 Dept。
如果可以保證數據是我們可以使用的結構,
cut
但不是在分隔符上拆分,我們可以只使用字元的實際位置來顯示。例子
這將從
data.txt
文件中剪切文本並列印位置 9 到 13 和 14 到 35 等處的任何內容。$ cut -c 9-13,14-35,43-58 data.txt 4567 Harrison Joel Accountant 4587 Mitchell Barbara Admin Asst 3589 Olson Timothy Supervisor 4591 Moore Sarah Dept Manager 4527 Polk John Accountant 4567 Harrison Joel Accountant 1557 Harrison James Supervisor
awk 重訪
Awk 也可以根據文本的位置而不是分隔符來提取文本。雖然它更冗長,但這裡是如何,只是為了完整性。
$ awk '{ printf "%s\t%-20s\t%s\n",substr($0,9,5),substr($0,14,22),substr($0,43,16) }' data.txt 4567 Harrison Joel Accountant 4587 Mitchell Barbara Admin Asst 3589 Olson Timothy Supervisor 4591 Moore Sarah Dept Manager 4527 Polk John Accountant 4567 Harrison Joel Accountant 1557 Harrison James Supervisor
awk 欄位寬度
如果您使用的是 GNU 的變體,
awk
則可以使用該變數FIELDWIDTHS
來指定每個欄位的靜態大小。substr
如果您可以訪問它,這將比該方法更清潔。您還可以有效地將原本會被解析為單獨欄位的欄位粘合在一起。$ awk 'BEGIN { FIELDWIDTHS="4 4 5 24 5 16 11" }{ print $3,$4,$5,$6 }' data.txt 4567 Harrison Joel M 4540 Accountant 4587 Mitchell Barbara C 4541 Admin Asst 3589 Olson Timothy H 4544 Supervisor 4591 Moore Sarah H 4500 Dept Manager 4527 Polk John S 4520 Accountant 4567 Harrison Joel M 4540 Accountant 1557 Harrison James M 4544 Supervisor