首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全传递值生成

全传递值生成
EN

Stack Overflow用户
提问于 2018-02-08 08:17:45
回答 2查看 71关注 0票数 0

我试图将双向同义词应用于CSV文件中的输入数据。

样本输入:

代码语言:javascript
复制
Col A,Col B
sleep tightxjump highxjump low,Two-way
shell scriptxawk script,One-way
oops langxstructure lang,Two-way

预期产出:

代码语言:javascript
复制
Col A.     
sleep tight=>jump high,jump low
jump high=>sleep tight,jump low
jump low=>jump high,sleep tight
shell script=>awk script
oops lang=>structure lang
structure lang=>oops lang

理想情况下,如果它是双向的,那么就应该有一个完整的传递关系。

我试过使用awk和shell,但无法让它工作。如有任何指示,将不胜感激。

PS:如果在java上提供任何指针,也会有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-08 08:41:06

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -r '1s/ \..*//p;/One-way/{s/ \..*//;s/x/=>/;s/x/,/;b};/Two-way/{s/ \..*//;s/(.*)x(.*)x(.*)/\1=>\2,\3\n\2=>\1,\3\n\3=>\1,\2/;b};d' file

这使用分组和反向引用来使输出符合所需的结果。当然,第二列可能有更多的值,需要以类似于Two-way的方式进行硬编码。

根据数据的变化情况如下:

代码语言:javascript
复制
sed -r '1s/\..*//;t;/One-way/{s/\s+\S+$//;s/x/=>/;s/x/,/g;b};/\n/{/^([^x]*x).*\n\1/d;bb};/Two-way/{s/\s+\S+$//;s/.*/&\n&/;:b;s/^([^x]*)x(.*)\n/&\2x\1\n/;s/x/=>/;:a;ta;s/x(.*\n.*\n)/,\1/;ta;P;D}' file

如上文所示,适用于第1行和One-way。当Two-way删除模式空间中的值时,它会复制并循环x分隔的值,直到它重复为止。

票数 1
EN

Stack Overflow用户

发布于 2018-02-08 10:11:08

您已经安装了awk -这里有高级的gawk解决方案:

代码语言:javascript
复制
awk 'NR==1{ print $1,$2$3; next }
    { split($1, a, "x") }
    {
        n=($3=="Two-way"? 4:2);
        for (i=1; i<n; i++) { 
            k=(i>1? i-1: i+1);
            printf "%s=>%s,%s\n", a[i], a[k], a[xor(i,k)] 
        } 
    }' file

产出:

代码语言:javascript
复制
Col A.
a1=>a2,a3
a2=>a1,a3
a3=>a2,a1
z1=>z2,z3

如果任何一个位都是1,则XOR操作的结果是1,但不是两者兼有。xor(v1, v2 [, …]) 返回参数的按位XOR。肯定至少有两个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48680668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档