1

次の形式の行を含むファイルを取得した場合:

SOME_ATTRIBUTE_1 XYZ; IMPORTANT_ATTRIBUTE_1 1234; SOME_ATTRIBUTE_2 XYZ; IMPORTANT_ATTRIBUTE_2 AB;

これを次の形式に変換して、2 つの重要な属性値が新しい属性を生成するようにします。

JOIN_IMPORTANT_ATTRIBUTE AB1234; SOME_ATTRIBUTE_1 XYZ; IMPORTANT_ATTRIBUTE_1 1234; SOME_ATTRIBUTE_2 XYZ; IMPORTANT_ATTRIBUTE_2 AB;

これは awk などのワンライナーで実行できますか? Javaトリックボックスをつかむことなく、これに取り組む方法がわかりません。

4

4 に答える 4

2

awk を使用すると、入力をセミコロン + 任意の数のスペースで分割し、次のように重要なフィールドをさらに分割できます。

awk -F'; *' '{ split($2, a1, / +/); split($4, a2, / +/); print "JOIN_IMPORTANT_ATTRIBUTE", a2[2] a1[2] ";", $0 }' infile 

出力:

JOIN_IMPORTANT_ATTRIBUTE AB1234; SOME_ATTRIBUTE_1 XYZ; IMPORTANT_ATTRIBUTE_1 1234; SOME_ATTRIBUTE_2 XYZ; IMPORTANT_ATTRIBUTE_2 AB;

これは、重要な属性がどの列にあるかを知っていることを前提としています。

于 2012-10-25T14:04:40.107 に答える
1
awk -F'[; ]+' '{print "JOIN_IMPORTANT_ATTRIBUTE", $8 $4 "; " $0}' file
于 2012-10-25T16:50:43.857 に答える
1

これは私の bash+awk の代替手段です。

cat attrs.awk
# Awk script to get joined attributes for one line of attributes

BEGIN {
RS=";";     
PROCINFO["sorted_in"]="@ind_num_asc"; #gawk only: sort attributes on their attr id (so that IMPORTANT_ATTRIBUTE_n comes before IMPORTANT_ATTRIBUTE_n+1
}

$1 ~ /^IMPORTANT_ATTRIBUTE_/ {
            attrId=substr($1, 1 + length("IMPORTANT_ATTRIBUTE_"));
    if ($2 ~ /^[0-9]/) 
            impAttrsNum[attrId]=$2;
    else
            impAttrsAlpha[attrId]=$2;
}

END {
    #alpha attribs come before num attribs
    for(i in impAttrsAlpha)
            alphaVals = alphaVals impAttrsAlpha[i];
    for(i in impAttrsNum)
            numVals = numVals impAttrsNum[i];

    printf("JOIN_IMPORTANT_ATTRIBUTE %s%s%s", alphaVals, numVals, RS);
}

cat joinattrs
#!/bin/bash
#
# Applies joined attributes for each input line

while read l
do
    if [[ -n "$l" ]]
    then   
            joinAttrs=$(echo "$l" | awk -f attrs.awk)
            echo "$joinAttrs $l"
    fi
done  

使用方法: ./joinattrs < データファイル

ワンライナーではありません:)

于 2012-10-26T19:04:43.510 に答える
1

Perl ソリューション:

perl -lane 'print join " ", "JOIN_IMPORTANT_ATTRIBUTE", substr($F[7], 0, -1) . $F[3], @F' 
于 2012-10-25T13:52:19.103 に答える