输入数据的特征

时间:2012-10-03 04:41:21

标签: unix sed grep

    * Each line consists of two fields, separated by a pipe '|', where
    * the first field is a comma-separated list of items, and
    * the second field is a tag.

这是我的INPUT:

        100,210,354,462|acct
        331,746,50|mis
        90,263,47,14|sales

并要求输出:

        100acct
        210acct
        354acct
        462acct
        331mis
        746mis
        50mis
        90sales
        263sales
        47sales
        14sales

5 个答案:

答案 0 :(得分:2)

sed '{s/^\([^a-z].*\),\([^a-z].*\),\([^a-z].*\),\([^a-z].*\)|\([^0-9].*\)$/\1\5\n\2\5\n\3\5\n\4\5/;s/^\([^a-z].*\),\([^a-z].*\),\([^a-z].*\)|\([^0-9].*\)$/\1\4\n\2\4\n\3\4/}' filename 

答案 1 :(得分:2)

使用GNU awk的一种方式:

awk -F "[,|]" '{ for (i=1; i<NF; i++) print $i$NF }' file.txt

结果:

100acct
210acct
354acct
462acct
331mis
746mis
50mis
90sales
263sales
47sales
14sales

答案 2 :(得分:1)

使用以下

sed 's/^\([^a-z].*\),\([^a-z].*\),\([^a-z].*\),\([^a-z].*\)|\([^0-9].*\)$/\1\5\n\2\5\n\3\5\n\4\5/g;s/^\([^a-z].*\),\([^a-z].*\),\([^a-z].*\)|\([^0-9].*\)$/\1\4\n\2\4\n\3\4/g'

答案 3 :(得分:0)

sed 's/\([0-9]\),\([0-9]*\),\([0-9]*\),*\([0-9]*\)\([,|]\)\(.*\)/\1\6\n\2\6\n\3\6\n\4\6/' input | sed '/^[a-z]*$/d'

此表达式为您提供正确的输出。

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed 's/\s*//;:a;s/,\(.*|\(.*\)\)/\2\n\1/;ta;s/|//' file

说明:

  1. s/\s*//删除记录前面的空格。
  2. :a;s/,\(.*|\(.*\)\)/\2\n\1/;ta将每个,替换为最后一个字段和换行符
  3. s/|//删除|
  4. 保留空白使用:

    sed -r 's/(\s*)(.*\|)/\2\1/;:a;s/,(.*\|(.*))/\2\n\1/;ta;s/\|//;s/(\S+)(\s+)(\S+)/\2\1\3/g' file