我试图将双向同义词应用于CSV文件中的输入数据。
样本输入:
Col A,Col B
sleep tightxjump highxjump low,Two-way
shell scriptxawk script,One-way
oops langxstructure lang,Two-way预期产出:
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上提供任何指针,也会有帮助。
发布于 2018-02-08 08:41:06
这可能对您有用(GNU sed):
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的方式进行硬编码。
根据数据的变化情况如下:
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分隔的值,直到它重复为止。
发布于 2018-02-08 10:11:08
您已经安装了awk -这里有高级的gawk解决方案:
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产出:
Col A.
a1=>a2,a3
a2=>a1,a3
a3=>a2,a1
z1=>z2,z3如果任何一个位都是1,则
XOR操作的结果是1,但不是两者兼有。xor(v1, v2 [, …])返回参数的按位XOR。肯定至少有两个。
https://stackoverflow.com/questions/48680668
复制相似问题