A. LINUX中如何不經過排序刪除文件中重復的行(相同行,只保留一個)
樓上 uniq必須是連續的重復才行把
用awk肯定行
這是一個cu的精華帖,差不多,對於你的問題你給稍等我修改一下。(ps感謝紅袖添香大姐)
CU精華 經典回顧
#假設我有如下文件:
#cat aa
#123 def1 456
#345 def2 812
#123 def3 563
#322 def4 684
#123 def5 879
#......................
#現在我想把第一列中欄位相同的合並,第一列不相同的則保留,合並的原則就是保留第一個出現的前兩個欄位,第三個欄位則把結果相加,以上面的示例為例:
#
#就是對於123開頭的需要合並,合並後應該成為如下:
#cat aa
#123 def1 1898
#345 def2 812
#322 def4 684
#用shell如何實現?
#希望各位幫助,,謝謝,,
#要求總結:
#1 合並相同的第一列數據,並且計算第三列和
#2 第二列只保留第一次出現
#3 第一列順序不變
覺得這個問題很經典,所以從CU論壇轉過來了。
請大家一起學習
我們站在巨人的肩膀上。
問題補充:
看不太懂實現可以講一下思路嗎?
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
我是這樣做的
--------------------------2
謝謝你的補充, 已經明白了你對split的適用技巧,是用split(a[$1],tmp)在碰到匹配的$1時取出以前的統計結然後再用$3加上以前的結果是吧,很巧妙。謝謝
但是有2個問題:
1不滿足 第二列保留第一次出現記錄(現在是保留最後一次出現)
2不滿足 第一列按照原來文件順序出現
看看這個
awk 'BEING{n=0}
{
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
if($1 in ind)next
ind[$1]
key[n]=$1
n++
}
END{
for(i in key)print key[i],b[key[i]],a[key[i]]
}' filename
#######################
#######################
#######################
這樣就行了
#,/bin/bash
awk 'BEGIN{n=0}
{
if($0 in a)next
a[$0]
b[n]=$0
n++
}
END{
for(i in b)print b[i]
}' data
前提是你的數據文件裡面每行沒有空格,如果有用-F設定一個沒有的字元作分隔符就。
B. Linux shell awk怎麼去除行內,重復列
awk-F"[-,]"'{for(i=1;i<=NF;i++)a[$i,NR]++}{for(jina){split(j,b,SUBSEP);if(b[2]==NR)printfb[1]""}printf" "}'關鍵詞.txt>去除重復後.txt
以此例測試通過。
關於awk二維數組的使用:
awk的多維數組在本質上內是一維數組,更確切一容點,awk在存儲上並不支持多維數組。awk提供了邏輯上模擬二維數組的訪問方式。例如,array[2,4] = 1這樣的訪問是允許的。awk使用一個特殊的字元串SUBSEP ( 34)作為分割欄位,在上面的例子中,關聯數組array存儲的鍵值實際上是2 344。
類似一維數組的成員測試,多維數組可以使用if ( (i,j) in array)這樣的語法,但是下標必須放置在圓括弧中。
類似一維數組的循環訪問,多維數組使用for ( item in array )這樣的語法遍歷數組。與一維數組不同的是,多維數組必須使用split()函數來訪問單獨的下標分量。split ( item, subscr, SUBSEP)。
C. LINUX如何刪除一個文件中的重復行後並保持原來順序
man
uniq
uniq
file_name
刪除重復的行(重復的行只保留1個)
uniq
-u
file_name
只保留唯一的行(重復的行全部被刪除)
但它只能處理相鄰的重復行
D. linux 去除空行,去除重復,去除特定符號
cat /etc/services | sed "/^$/d" | uniq | sed "/^#/d"
cat /etc/services 打開文件 是你自己說用cat的,這里可專以不用屬cat的
|是管道
sed "/^$/d" 刪除空行
uniq排除重復的行
sed "/^#/d" 刪除以#開頭的行
E. linux去除重復行命令 重復行不固定。不是相鄰的 求命令
sort aaa.txt | uniq > xxx.txt
F. linux grep查詢結果再過濾
令|grep查詢過濾需要使用管道命令|。
舉例說明:
1、在進程表中查找特定進程的命令通常如專下:
G. 如何快速刪除Linux文件中的重復數據行
用uniq,如下,抄將 1.txt 中 所有 "相鄰" 重復行合並成一行,結果存入 2.txt
uniq1.txt>2.txt
如果是想將相鄰重復行徹底刪掉(而不是合並成一行),可以用
uniq-u1.txt>2.txt
H. linux寫一個shell命令行從一個文件中存儲刪除重復行 在另一個文件的輸出。不使用任何腳本
使用sort命令的-u選項即可:
sort -u file1 >file2
I. LINUX下去除文件中重復的行
比如你/etc/passwd文件中有重復的行,執行如下指令清除:
cat /etc/passwd | sort -u > /tmp/passwd
這樣/tmp/passwd中就沒有重復的行了
J. 如何快速刪除Linux文件中的重復數據行
可以借抄助awk來實現,准備處理的文件是 $filename
awk'{if(line[$0]==1){next;}else{print$0;line[$0]=1}}'<(cat$(filename)>$filename
便可以實現每一行只出現一次,且順序保持不變