Awk
如何從第 30 個製表符或第 88 個空格開始格式化文件的最後 3 列
Ubuntu 16.04 GNU bash,版本 4.4.0
我想格式化這個包含 1,264,524 行的郵政編碼歸檔的文本文件。
#!/bin/bash wget http://download.geonames.org/export/zip/allCountries.zip unzip allCountries.zip mv -f allCountries.txt .allCountries.txt rm -f allCountries.zip
這是未格式化的文件的一部分。
AD AD100 Canillo 42.5833 1.6667 6 AD AD200 Encamp 42.5333 1.6333 6 AD AD300 Ordino 42.6 1.55 6 AD AD400 La Massana 42.5667 1.4833 6 AD AD500 Andorra la Vella 42.5 1.5 6 AD AD600 Sant Julià de Lòria 42.4667 1.5 6 AD AD700 Escaldes-Engordany 42.5 1.5667 6 AR 3636 POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S)) Salta A -23.4933 -61.9267 3 AR 4123 LAS SALADAS Salta A -25.7833 -64.5 4 AR 4126 BARADERO Salta A -26.0833 -65.263 3 AR 4126 EL CUIBAL Salta A -26.0833 -65.263 3 AR 4126 LA ASUNCION Salta A -26.0833 -65.263 3 AR 4126 MIRAFLORES (TALA, DPTO. CANDELARIA) Salta A -26.0833 -65.263 3 AR 4141 TOLOMBON Salta A -26.2 -65.9167 4 AR 4141 QUISCA GRANDE Salta A -26.4367 -65.97 3 AR 4141 LA CIENEGUITA Salta A -26.4367 -65.97 3 AR 4141 MACHO RASTROJO Salta A -26.4367 -65.97 3 AR 4190 ROSARIO DE LA FRONTERA Salta A -25.8 -64.9667 4 AR 4190 OVANDO Salta A -25.8 -65.1 4 AR 4190 SAN ESTEBAN Salta A -25.8 -65.0333 3 AR 4190 LA BANDA (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA) Salta A -25.8 -65.0333 3 AR 4190 LA MATILDE Salta A -25.8 -65.0333 3 AR 4190 LAS PIEDRITAS Salta A -25.8 -65.0333 3 AR 4190 LOS POCITOS Salta A -25.8 -65.0333 3 AR 4190 OJO DE AGUA (ROSARIO DE LA FRONTERA, DPTO. R.DE LA FRONTERA) Salta A -25.8 -65.0333 3 AR 4190 POTRERILLO (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA) Salta A -25.8 -65.0333 3
這應該是最終結果:
AD AD100 Canillo 42.5833 1.6667 6 AD AD200 Encamp 42.5333 1.6333 6 AD AD300 Ordino 42.6 1.56 6 AD AD400 La Massana 42.5667 1.4833 6 AD AD500 Andorra la Vella 42.5 1.6 6 AD AD600 Sant Julià de Lòria 42.4667 1.5 6 AD AD700 Escaldes-Engordany 42.5 1.5667 6 AR 3636 POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S)) Salta A -23.4933 -61.9267 3 AR 4123 LAS SALADAS Salta A -25.7833 -64.5 4 AR 4126 BARADERO Salta A -26.0833 -65.263 3 AR 4126 EL CUIBAL Salta A -26.0833 -65.263 3 AR 4126 LA ASUNCION Salta A -26.0833 -65.263 3 AR 4126 MIRAFLORES (TALA, DPTO. CANDELARIA) Salta A -26.0833 -65.263 3 AR 4141 TOLOMBON Salta A -26.2 -65.9167 4 AR 4190 OJO DE AGUA (ROSARIO DE LA FRONTERA, DPTO. R.DE LA FRONTERA) Salta A -25.8 -65.0333 3 AR 4190 POTRERILLO (R. DE LA FRONTERA, DPTO. ROSARIO DE LA FRONTERA) Salta A -25.8 -65.0333 3
所以從左邊第 3 列到最後一列的第 30 個製表符或 88 個空格應該開始。最後 3 列的第一個字元相隔 12 個空格。
每行都有數據,所以我嘗試將最後 3 列剪切到另一個文件中。然後我嘗試從原始文件中刪除所有空格,然後將其格式化為列。第三列給我帶來了麻煩,因為如果這樣做
awk 'BEGIN{ OFS="\t"}{ print $1, $2, NR }' .allCountries.txt
AT 4873 Pehigen 34069 AT 4873 Hofberg 34070 AT 4873 Wiederhals 34071 AT 4873 Oberedt 34072 AT 4873 Oberegg 34073 AT 4873 Raitenberg 34074 AT 4873 Redltal 34075 AT 4873 Friedhalbing 34076 AT 4873 Unterhaselbach 34077 AT 4873 Redltal 34078 AT 4873 Erkaburgen 34079 AT 4873 Mayrhof 34080 AT 4873 Erdpries 34081 AT 4873 Grünbergsiedlung 34082 AT 4873 Brunnhölzl 34083 AT 4873 Seibrigen 34084 AT 4873 Kinast 34085 AT 4873 Stöckert 34086 AT 4873 Frankenburg 34087 AT 4873 Fischeredt 34088 AT 4873 Marigen 34089 AT 4873 Oberhaselbach 34090 AT 4873 Ottokönigen 34091 AT 4873 Fischigen 34092 AT 4873 Endriegl 34093
任何幫助都會很重要。
這似乎做到了。作為一個簡單的單行
awk
,它應該對 1.2m 行文件執行得相當快。通過根據您的範例創建一個 1.3m 行的虛擬文件,我看到它在具有 4GB 記憶體和 GNU Awk 4.0.2 的基本 CentOS 7 VM 上在 24 秒內完成。要從 StackExchange 獲得一些準確的響應,您可能希望將範例輸入連同範例輸出一起發佈到 pastebin。
$ awk '{printf "%s %-6s%-81s%-12s%-12s%s\n",$1,$2,gensub(/[0-9.-]* +[0-9.-]* +[0-9]$/,"","g",substr($0,10)),$(NF-2),$(NF-1),$NF}' inp | head AD AD100 Canillo 42.5833 1.6667 6 AD AD200 Encamp 42.5333 1.6333 6 AD AD300 Ordino 42.6 1.55 6 AD AD400 La Massana 42.5667 1.4833 6 AD AD500 Andorra la Vella 42.5 1.5 6 AD AD600 Sant Julià de Lòria 42.4667 1.5 6 AD AD700 Escaldes-Engordany 42.5 1.5667 6 AR 3636 POZO CERCADO (EL CHORRO (F), DPTO. RIVADAVIA (S)) Salta A -23.4933 -61.9267 3 AR 4123 LAS SALADAS Salta A -25.7833 -64.5 4 AR 4126 BARADERO Salta A -26.0833 -65.263 3 $