Shell 如何使用unix命令从文件中删除第'v'行(当第'u v'行已存在时)
我有以下测试数据:Shell 如何使用unix命令从文件中删除第'v'行(当第'u v'行已存在时),shell,unix,awk,graph,Shell,Unix,Awk,Graph,我有以下测试数据: a b a c b a b c b d c a c b c d d b d c 当使用unix命令已经存在行uv时,我想删除行vu。例如,我想在这里获得: a b a c b c b d c d 我尝试过使用awk脚本,但在长文件上需要花费太多时间: { if(NR==1){ n1=$1 n2=$2 test=0 k=0 i = 0 column1[i]=$1 column2[i]=$2 printf "%s
a b
a c
b a
b c
b d
c a
c b
c d
d b
d c
当使用unix命令已经存在行uv
时,我想删除行vu
。例如,我想在这里获得:
a b
a c
b c
b d
c d
我尝试过使用awk脚本,但在长文件上需要花费太多时间:
{
if(NR==1){
n1=$1
n2=$2
test=0
k=0
i = 0
column1[i]=$1
column2[i]=$2
printf "%s %s\n", column1[i], column2[i]
}
else{
for(k=0; k<=i;k++){
if(column1[k]==$2){
test=1
tmp=i
break
}
}
if(test==1){
if(column2[tmp]==$1){
n1=$1
n2=$2
}
}
else if(n1!=$1||n2!=$2){
n1=$1
n2=$2
i++
column1[i]=$1
column2[i]=$2
printf "%s %s\n", column1[i], column2[i]
}
test=0
}
}
{
如果(NR==1){
n1=1美元
n2=2美元
测试=0
k=0
i=0
第1列[i]=1美元
第2栏[i]=2美元
printf“%s%s\n”,第1列[i],第2列[i]
}
否则{
对于(k=0;k我认为这可以非常简单地实现:
awk '!seen[$1,$2]++ && !seen[$2,$1]' file
这仅在第一列和第二列尚未按任意顺序显示时打印行(默认操作)
数组seen
通过设置包含第一个和第二个字段的键来跟踪每一对字段。表达式!seen[key]++
仅在第一次测试特定的键时为真,因为数组中的值每次都递增。我认为这可以非常简单地实现:
awk '!seen[$1,$2]++ && !seen[$2,$1]' file
这仅在第一列和第二列尚未按任意顺序显示时打印行(默认操作)
数组seen
通过设置包含第一个和第二个字段的键来跟踪每对字段。表达式!seen[key]++
仅在第一次测试特定的键时为真,因为数组中的值每次都递增