awk分组和分割多个分隔符

时间:2016-02-16 22:41:56

标签: regex shell awk sed

我正在尝试在多个分隔符上分割一行,并将输出分组为可以重新排序的单个元素。我在运行pkg_info命令的BSD系统上。输出看起来像这样。

yaesu-0.13nb1       Control interface for Yaesu FT-890 HF transceiver   
skk-jisyo-cdb-201212 Dictionary collection for SKK  
dbskkd-cdb-2.00nb1  SKK dictionary server based on cdb
libchewing-0.2.7    The intelligent phonetic input method library  
skk-jisyo-201212    Dictionary collection for SKK  
autoconf-2.69nb2    Generates automatic source code configuration scripts  
pkg-config-0.28     System for managing library compile/link flags 
python27-2.7.5      Interpreted, interactive, object-oriented programming language

包名称始终包含字母和数字,版本是附加到名称的最后一个条目,描述始终由至少一个空格分隔。最复杂的例子是,“skk-jisyo-cdb”是包名。 “201212”是版本,“SKK字典集”是描述。

我需要将版本与软件包名称分开,保留软件包名称,并在其中留下“ - ”,同时从中分割版本信息并使其成为自己的元素。最后,我需要将描述作为第三要素保持不变。

我认为awk或sed能够做到这一点,但还没有能够正确分组元素。非常感谢任何帮助!

以下是我迄今为止尝试过的一些内容:

pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | awk -F- '{$NF=" "$NF;sub(/ /,"-")}1'

输出:

yaesu- 0.13nb1
skk-jisyo cdb  201212
dbskkd-cdb  2.00nb1
libchewing- 0.2.7
skk-jisyo  201212
autoconf- 2.69nb2
pkg-config  0.28
python27- 2.7.5

pkg_info -a | awk 'BEGIN{FS="-| ";OFS="\t"}{print $1$2}'

输出:

yaesu0.13nb1
skkjisyo
dbskkdcdb
libchewing0.2.7
skkjisyo
autoconf2.69nb2
pkgconfig
python272.7.5

我已经能够使用2个命令分离包名称和版本,但这不是我想要/需要的。这些仅供参考。 这将使我自己得到版本:

pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | awk -F- '{print $NF }'

这将为我提供包名:

pkg_info -a | awk -F'[[:space:]]*' '{print $1}' | sed 's/\(.*\)\(-.*\)/\1/g'

我需要的最终输出是$pkgname\t$version\t$description\n这将由\t标签分隔 使用最复杂的示例,输出将是: skk-jisyo-cdb\t201212\tDictionary collection for SKK\n

2 个答案:

答案 0 :(得分:2)

你没有提供足够的细节以确定,但这可能是你想要的:

$ sed -r 's/([^[:blank:]]+)-([^[:blank:]]+)[[:blank:]]+/\1\t\2\t/' file
yaesu   0.13nb1 Control interface for Yaesu FT-890 HF transceiver   
skk-jisyo-cdb   201212  Dictionary collection for SKK  
dbskkd-cdb      2.00nb1 SKK dictionary server based on cdb
libchewing      0.2.7   The intelligent phonetic input method library  
skk-jisyo       201212  Dictionary collection for SKK  
autoconf        2.69nb2 Generates automatic source code configuration scripts  
pkg-config      0.28    System for managing library compile/link flags 
python27        2.7.5   Interpreted, interactive, object-oriented programming language

$ awk -v OFS='\t' '{ pkg=ver=$1; sub(/-[^-]+$/,"",pkg); sub(/.*-/,"",ver); sub(/[^[:space:]]+[[:space:]]+/,""); print pkg, ver, $0}' file  
yaesu   0.13nb1 Control interface for Yaesu FT-890 HF transceiver   
skk-jisyo-cdb   201212  Dictionary collection for SKK  
dbskkd-cdb      2.00nb1 SKK dictionary server based on cdb
libchewing      0.2.7   The intelligent phonetic input method library  
skk-jisyo       201212  Dictionary collection for SKK  
autoconf        2.69nb2 Generates automatic source code configuration scripts  
pkg-config      0.28    System for managing library compile/link flags 
python27        2.7.5   Interpreted, interactive, object-oriented programming language

将分隔符从tab更改为您想要的任何内容。

答案 1 :(得分:0)

您可以在字段1上使用默认字段分隔符和拆分功能。然后,您只需将字段分隔符和拆分的最后一项附加到第一个字段:

awk '{n=split($1, a, "-"); $1=$1 FS a[n]}1'