首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用awk或sed进行数据清理和格式化

使用awk或sed进行数据清理和格式化
EN

Stack Overflow用户
提问于 2014-07-22 11:05:03
回答 4查看 1.3K关注 0票数 1

这是我的文本文件的摘录

代码语言:javascript
复制
 namq_aux_lp   4 Last update of data 07.07.2014  t
 namq_aux_ulc   4 Last update of data 08.07.2014  
  namq_aux_gph   4 Last update of data 07.07.2014  
  prc_hicp_cann   4 Last update of data 17.07.2014 
 namq_nace10_k   4 Last update of data 02.07.2014  clas
sei_bsco_m   4 Last update of data 10.06.2014  
ei_bsin_m_r2   4 Last update of data 26.06.2014  
 lassei_bsbu_m_r2   4 Last update of data 26.06.2014  
assei_bsrt_m_r2   4 Last update of data 26.06.2014  t
 ei_bssi_m_r2   4 Last update of data 26.06.2014  t
ei_bsse_m_r2   4 Last update of data 26.06.2014  
 ei_bsci_m_r2   4 Last update of data 26.06.2014  
10    sts_trtu_m   4 Last update of data 17.07.2014 c

我试图格式化和清理它,保留它的第一栏和日期。但是,正如您所看到的,在最后一行中有10。我不能删除它,因为如果我这样做,sei_bsco_m的日期将被截取。

任何帮助都将不胜感激。

Note代码在这里https://ideone.com/JbuRHK

预期产出将是:

代码语言:javascript
复制
namq_aux_lp     07.07.2014
namq_aux_ulc    08.07.2014 
...
assei_bsrt_m_r2 26.06.2014
...
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-22 12:08:12

只需查找从第7字段开始的每一行的第一个日期,然后打印该日期加上第6个-前一个字段:

代码语言:javascript
复制
$ awk '{
    for (i=7;i<=NF;i++)
        if ($i ~ /^([[:digit:]]{2}\.){2}[[:digit:]]{4}$/) {
            printf "%-20s%10s\n", $(i-6), $i
            next
        }
}' file
namq_aux_lp         07.07.2014
namq_aux_ulc        08.07.2014
namq_aux_gph        07.07.2014
prc_hicp_cann       17.07.2014
namq_nace10_k       02.07.2014
sei_bsco_m          10.06.2014
ei_bsin_m_r2        26.06.2014
lassei_bsbu_m_r2    26.06.2014
assei_bsrt_m_r2     26.06.2014
ei_bssi_m_r2        26.06.2014
ei_bsse_m_r2        26.06.2014
ei_bsci_m_r2        26.06.2014
sts_trtu_m          17.07.2014

以上并不关心您可能有多少引导或落后的不希望字段,或者这些字段可能包含哪些字段,只要您没有7个领先的不希望字段,而第7个字段是约会!

或者,这只会打印字符串"4最后更新数据“的每一侧的第一个内容:

代码语言:javascript
复制
$ awk -F'[[:space:]]+[[:digit:]]+ Last update of data[[:space:]]+' '{
    sub(/.*[[:space:]]/,"",$1)
    sub(/[[:space:]].*$/,"",$2)
    printf "%-20s%10s\n", $1, $2
}' file
namq_aux_lp         07.07.2014
namq_aux_ulc        08.07.2014
namq_aux_gph        07.07.2014
prc_hicp_cann       17.07.2014
namq_nace10_k       02.07.2014
sei_bsco_m          10.06.2014
ei_bsin_m_r2        26.06.2014
lassei_bsbu_m_r2    26.06.2014
assei_bsrt_m_r2     26.06.2014
ei_bssi_m_r2        26.06.2014
ei_bsse_m_r2        26.06.2014
ei_bsci_m_r2        26.06.2014
sts_trtu_m          17.07.2014
票数 2
EN

Stack Overflow用户

发布于 2014-07-22 11:12:08

以下是一些可能有效的方法:

代码语言:javascript
复制
awk '/^10/ {$1=""}1' file | column -t
namq_aux_lp       4  Last  update  of  data  07.07.2014  t
namq_aux_ulc      4  Last  update  of  data  08.07.2014
namq_aux_gph      4  Last  update  of  data  07.07.2014
prc_hicp_cann     4  Last  update  of  data  17.07.2014
namq_nace10_k     4  Last  update  of  data  02.07.2014  clas
sei_bsco_m        4  Last  update  of  data  10.06.2014
ei_bsin_m_r2      4  Last  update  of  data  26.06.2014
lassei_bsbu_m_r2  4  Last  update  of  data  26.06.2014
assei_bsrt_m_r2   4  Last  update  of  data  26.06.2014  t
ei_bssi_m_r2      4  Last  update  of  data  26.06.2014  t
ei_bsse_m_r2      4  Last  update  of  data  26.06.2014
ei_bsci_m_r2      4  Last  update  of  data  26.06.2014
sts_trtu_m        4  Last  update  of  data  17.07.2014  c

或者得到你的输出:

代码语言:javascript
复制
awk '/^10/ {$1=""}1' file | awk '{print $1,$7}' OFS="\t"
namq_aux_lp     07.07.2014
namq_aux_ulc    08.07.2014
namq_aux_gph    07.07.2014
prc_hicp_cann   17.07.2014
namq_nace10_k   02.07.2014
sei_bsco_m      10.06.2014
ei_bsin_m_r2    26.06.2014
lassei_bsbu_m_r2        26.06.2014
assei_bsrt_m_r2 26.06.2014
ei_bssi_m_r2    26.06.2014
ei_bsse_m_r2    26.06.2014
ei_bsci_m_r2    26.06.2014
sts_trtu_m      17.07.2014

或者像这样:

代码语言:javascript
复制
awk '/^10/ {$1=""}1' file | awk '{print $1,$7}' | column -t
namq_aux_lp       07.07.2014
namq_aux_ulc      08.07.2014
namq_aux_gph      07.07.2014
prc_hicp_cann     17.07.2014
namq_nace10_k     02.07.2014
sei_bsco_m        10.06.2014
ei_bsin_m_r2      26.06.2014
lassei_bsbu_m_r2  26.06.2014
assei_bsrt_m_r2   26.06.2014
ei_bssi_m_r2      26.06.2014
ei_bsse_m_r2      26.06.2014
ei_bsci_m_r2      26.06.2014
sts_trtu_m        17.07.2014
票数 1
EN

Stack Overflow用户

发布于 2014-07-22 11:19:34

您可以使用sedcolumn

代码语言:javascript
复制
sed -nr 's|.*\b(\S+_\S+)\b.*\b([0-9]+[.][0-9]+[.][0-9]+)\b.*|\1\t\2|p' file | column -t

输出:

代码语言:javascript
复制
namq_aux_lp       07.07.2014
namq_aux_ulc      08.07.2014
namq_aux_gph      07.07.2014
prc_hicp_cann     17.07.2014
namq_nace10_k     02.07.2014
sei_bsco_m        10.06.2014
ei_bsin_m_r2      26.06.2014
lassei_bsbu_m_r2  26.06.2014
assei_bsrt_m_r2   26.06.2014
ei_bssi_m_r2      26.06.2014
ei_bsse_m_r2      26.06.2014
ei_bsci_m_r2      26.06.2014
sts_trtu_m        17.07.2014

注意:

  • 该列与带有下划线_的所有内容匹配。
  • \S可能无法工作,所以您也可以考虑[^[:space:]][^ \t\r]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24885664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档