我正在尝试在多个分隔符上分割一行,并将输出分组为可以重新排序的单个元素。我在运行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
答案 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'