我有一個像格式數據
name1 123
name1 324
name2 123
name2 324
name2 456
數據現在我要像
name1 123
324
name2 123
324
456
名稱O/P不應重複再
我有一個像格式數據
name1 123
name1 324
name2 123
name2 324
name2 456
數據現在我要像
name1 123
324
name2 123
324
456
名稱O/P不應重複再
來源
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到TAB
OFS="\t"
得到我們預期的結果。
如果你的文件進行排序,然後嘗試這個awk
$ 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
@ Rbk528:嘗試:
awk '{printf("%s %s\n",!a[$1]++?$1:" ",$2)}' Input_file
我知道你問awk
,但大多數地方有awk
也有perl
:
perl -lape 's/^(\w+)/" "x length($1)/e if $seen{$F[0]}++;'
任何嘗試? .. – klashxx
試圖比較先前的行和當前行的字段,但無法進入awk – Rbk528