交换输出中的2列---- Sed或Awk?

时间:2012-07-19 20:02:33

标签: shell unix sed awk swap

输入文件:

GET /static_register_ad_request_1_2037_0_0_0_1_1_4_8335086462.gif?pa=99439_50491&country=US&state_fips_code=US_CA&city_name=Los%2BAngeles&dpId=2&dmkNm=apple&dmlNm=iPod%2Btouch&osNm=iPhone%2BOS&osvNm=5.1.1&bNm=Safari&bvNm=null&spNm=SBC%2BInternet%2BServices&kv=0_0&sessionId=0A80187E0138A0AE42E4DE3F783E7A08&sdk_version=4.0.5.6%20&domain=805AOEtUaMu&ad_catalog=99439_50491&make=APPLE&width=320&height=460&slot_type=PREROLL&model=iPod%20touch%205.1.1&iabcat=artsandentertainment&iabsubcat=music&age=113&gender=2&zip=92869 HTTP/1.1

输出文件:

domain  sdk_version

805AOEtUaMu 4.0.5.6%20

我可以使用sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\1 \2/p'来获取结果,但是第一列中的sdk_version,我需要的是在outputfile中交换sdk_version和domain列。

有人可以帮我吗?非常感谢你提前:))

3 个答案:

答案 0 :(得分:1)

只需交换你的反对意见:

sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/p'

答案 1 :(得分:0)

使用awk的一种方式:

awk '
    BEGIN { 
        FS = "&";
    } 
    { 
        for ( i = 15; i <= 16; i++ ) { 
            split( $i, f, /=/ ); 
            printf( "%s ", f[2] ); 
        } 
    } 
    END { 
        printf "\n"; 
    }
' infile

输出:

4.0.5.6%20 805AOEtUaMu

答案 2 :(得分:0)

如果您想处理任意顺序,我建议您切换到awk或Perl。

perl -ne 'm/[?&]domain=([^&]+)/ && $d = $1;
    m/[?&]sdk_version=([^&]+) && $s = $1;
    print "$d\t$s\n"' logfile