[英]Using Awk to process a file where each record has different fixed-width fields
[英]Extract values from a fixed-width column
我有一個名為file
文本文件,其中包含以下內容:
Australia AU 10
New Zealand NZ 1
...
如果我使用以下命令從第一列中提取國家/地區名稱:
awk '{print $1}' file
我得到以下信息:
Australia
New
...
僅輸出每個國家名稱的第一個單詞。
我怎樣才能得到整個國家的名字?
嘗試這個:
$ awk '{print substr($0,1,15)}' file
Australia
New Zealand
擺脫最后兩列
awk 'NF>2 && NF-=2' file
NF>2
是過濾具有2個以上字段的記錄的保護。 如果您的數據一致,您可以簡單地將其刪除
awk 'NF-=2' file
為了補充Raymond Hettinger有用的POSIX兼容答案 :
您的country-name列看起來像是23個字符寬。
在最簡單的情況下, 如果您不需要修剪尾隨空格 ,則可以使用cut
:
# Works, but has trailing whitespace.
$ cut -c 1-23 file
Australia
New Zealand
警告 : GNU cut
不支持UTF-8,因此如果輸入是UTF-8編碼並包含非ASCII字符,則上述操作將無法正常工作。
要修剪尾隨空格 ,您可以利用GNU awk
的非標准FIELDWIDTHS
變量:
# Trailing whitespace is trimmed.
$ awk -v FIELDWIDTHS=23 '{ sub(" +$", "", $1); print $1 }' file
Australia
New Zealand
FIELDWIDTHS=23
聲明第一個字段(反映在$1
)為23個字符寬。
sub(" +$", "", $1)
然后通過用空字符串替換字段末尾( $1
)的任何非空運行空格( " +"
),從$1
刪除尾隨空格。
但是,您的Linux發行版可能會與Mawk而不是GNU Awk一起發布; 使用awk -W version
來確定它是哪一個。
對於修剪尾隨空格的POSIX兼容解決方案,請擴展Raymond的答案:
# Trailing whitespace is trimmed.
$ awk '{ c=substr($0, 1, 23); sub(" +$", "", c); print c}' file
Australia
New Zealand
在您的數據有空格的情況下,這無關緊要,但通常沒有:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
foo bar baz etc...
在這些情況下,使用tr
刪除多個空格可以很容易地獲取IMAGE
列:
$ docker ps | tr --squeeze-repeats ' '
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
foo bar baz
現在你可以通過管道(沒有討厭的標題行)來cut
:
$ docker ps | tr --squeeze-repeats ' ' | tail -n +2 | cut -d ' ' -f 2
foo
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.