-1
    * 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.

これは私の入力です:

        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
4

5 に答える 5

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 
于 2012-10-03T04:54:25.793 に答える
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
于 2012-10-03T05:04:00.790 に答える
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'
于 2012-10-03T05:01:34.203 に答える
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'

この式は、正しい出力を提供します。

于 2012-10-03T04:51:19.193 に答える
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/|//を削除します|

空白の使用を保持するには:

sed -r 's/(\s*)(.*\|)/\2\1/;:a;s/,(.*\|(.*))/\2\n\1/;ta;s/\|//;s/(\S+)(\s+)(\S+)/\2\1\3/g' file
于 2012-10-03T05:03:53.083 に答える