根据特殊条件对第一列排序两个文件

时间:2016-06-02 14:20:04

标签: bash sorting awk compare

我发现了比较和排序文件的类似主题,但没有人符合我的需求。试着解释一下例子:

cat file1

D value1 value2 value[n]
Z value1 value2 value[n]
H value1 value2 value[n]
A value1 value2 value[n]
C value1 value2 value[n]

cat file2

C value11 value22 value[n]
D value11 value22 value[n]
A value11 value22 value[n]

欲望输出:

猫输出

D value11 value22 value[n]
Z ------- ------- -------[n]
H ------- ------- -------[n]
A value11 value22 value[n]
C value11 value22 value[n]

因此,根据第一列file2与file1进行比较 - 如果匹配打印整行file2,但按照file1进行排序。如果没有匹配打印只是第一列后面的点(-------)。两个文件的列数不同。

任何想法或帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

  

如果没有匹配打印点后面的第一列(-------)。

因此我认为[n]也应该被-替换。

然后这个:

awk 'NR==FNR{a[$1]++;next}!a[$1]{for(i=2;i<=NF;i++)gsub(/./,"-",$i)}7' f2 f1

给出:

D value1 value2 value[n]
Z ------ ------ --------
H ------ ------ --------
A value1 value2 value[n]
C value1 value2 value[n]

修改

awk 'NR==FNR{a[$1]=$0;next}{if(a[$1])$0=a[$1];else for(i=2;i<=NF;i++)gsub(/./,"-",$i)}7' f2 f1

给出:

D value11 value22 value[n]
Z ------ ------ --------
H ------ ------ --------
A value11 value22 value[n]
C value11 value22 value[n]

答案 1 :(得分:2)

你可以使用这个awk:

awk 'FNR==NR{a[$1]; next} 
{
  if (a[$1])
     $0=a[$1]
  else {
     s=$1
     gsub(/[^[:blank:]]/, "-")
     $1=s
     $NF=$NF "[n]"
} 1' file2 file1

D value11 value22 value[n]
Z ------ ------ --------[n]
H ------ ------ --------[n]
A value11 value22 value[n]
C value11 value22 value[n]