簡體   English   中英

從固定寬度的列中提取值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM