2017-03-09 84 views
-2

我有一個像格式數據

name1 123 
name1 324 
name2 123 
name2 324 
name2 456 

數據現在我要像

name1 123 
     324 
name2 123 
     324 
     456 

名稱O/P不應重複再

+2

任何嘗試? .. – klashxx

+0

試圖比較先前的行和當前行的字段,但無法進入awk – Rbk528

回答

2

來源

name1 123 
name1 324 
name2 123 
name2 324 
name2 456 

代碼

awk '{$1= a[$1]++ ? "" : $1}1' OFS="\t" file 

結果

name1 123 
     324 
name2 123 
     324 
     456 

說明

讓我們用ternary操作。

如果我們的關鍵$1,第一場看到陣列a[$1]++中然後設置第一個字段爲空字符串"",如果沒有則實際值將被保留。

1最後只是一個快捷鍵以避免使用print語句。

在awk中,當條件匹配時,缺省操作是打印輸入行。

$ echo "test" |awk '1' 

等同於:

echo "test"|awk '1==1' 

echo "test"|awk '{if (1==1){print}}' 

這是因爲1將永遠真

最後一步組去O本安輸出F ield S eparator到TABOFS="\t"得到我們預期的結果。

0

如果你的文件進行排序,然後嘗試這個

$ cat file 
name1 123 
name1 324 
name2 123 
name2 324 
name2 456 

對於排序文件

$ awk '$1!=p{print;p=$1;next}{printf("%*s %s\n",length(p)," ",$2)}' file 
name1 123 
     324 
name2 123 
     324 
     456 

對於未排序的文件

$ awk '{a[$1]=$1 in a ? sprintf("%s\n%*s %s",a[$1],length($1)," ",$2): $2}END{for(i in a)print i, a[i]}' file 
name1 123 
     324 
name2 123 
     324 
     456 

更好的閱讀的版本

awk ' 
    { 
     a[$1]=$1 in a ? sprintf("%s\n%*s %s",a[$1],length($1)," ",$2): $2 
    } 
    END{ 
     for(i in a) 
      print i, a[i] 
    } 
    ' file 

即使你的輸入文件不排序像下面一個,上面一會工夫

$ cat unsorted file 
name1 123 
name2 123 
name1 324 
name2 324 
name2 456 
0

@ Rbk528:嘗試:

awk '{printf("%s %s\n",!a[$1]++?$1:"  ",$2)}' Input_file 
0

我知道你問awk,但大多數地方有awk也有perl

perl -lape 's/^(\w+)/" "x length($1)/e if $seen{$F[0]}++;'