當前位置:首頁 » 凈水方式 » shell過濾重復

shell過濾重復

發布時間: 2021-01-13 18:44:38

❶ shell腳本取重復數據的最後一條記錄

假設你這個.unl文件叫 file.unl,並且內容不含斜杠 / 。
腳本大致如下:

#!/bin/bash
myfile=file.unl
touch tmp
while read line
do
grep "$line" tmp >/dev/null 2>&1
if [ $? -eq 0 ]; then
num=`awk '{print $NF}' tmp`
num=`expr $num + 1`
sed -i 「s/^\($line\t\)[0-9]*$/\1$num/」 tmp
else
echo -e "$line\t1" >>tmp
fi
done <$myfile # ---> 1), 2)
awk '$NF>1{print}' tmp >err.unl # ---> 3)
sed -i 's/^\(..*\)\t[0-9]*$/\1/' tmp
mv -f tmp $myfile # ---> 4)
exit 0

思路就是,
1)遍歷 unl 文件的每一行,逐行拷貝一份到臨時文件tmp中,後面附加一個出現的次數。
2)遍歷的同時到tmp文件中去查找是否有已存在的相同記錄,如果有,就只是更新tmp文件中記錄的次數而不添加一個新記錄。
3)最後根據tmp文件中記錄的次數是否大於1來生成err.unl文件,記錄重復的行及總共出現的次數。
4)將tmp文件中的次數記錄去除即得到更新後的 unl 文件。
由於要求要覆蓋原unl文件,所以這里存在風險。 建議運行腳本前先備份一下原unl文件。

最後,恕我直言,這個題目的難度不止10分。
你看,while循環,grep / sed / awk,全用上了 ^_^
————————————————————————————————————
發現一個更簡練的方法,兩條命令即可搞定:
awk '{s[$0]+=1} END{for(a in s) print a, s[a]}' file.unl >err.unl
awk '{print $1}' err.unl >file.unl
當然,前提是unl文件的每行內容不能含有空格或TAB之類的分隔符。
參考了 http://..com/question/271261293.html#here 這個問題中shuguangbo童鞋的回答。

❷ SHELL腳本判斷文件里有沒有重復內容

遍歷文抄件,用襲key計數,如果大於1就代表有重復
awk -F"=" 'BEGIN{i=0;j=0}{a[i++]=$0;b[j++]++}END{for (i=1;i<NF;i++){if(b[i]>1) print a[i]":"b[i] }}'

❸ Linux系統下Shell重復執行上條命令的幾種方法

Linux系統下Shell重復執行上條命令的 4 種方法:
1、使用上方向鍵,並回車執行。
2、按 !! 並回車執行。
3、輸入 !-1 並回車執行。
4、按 Ctrl+P 並回車執行。

❹ 用shell找出除ID外重復的列

樓主你不厚道。

====================

不知道是不是Linux的shell,如果是UNIX,就把下面的/bin/bash改為相應的shell。

下面是具體的代碼和測試結果。

這個腳本是讀"$1"參數的,所以執行的時候直接將1.txt綴上就可以了

格式如下:

./find.sh1.txt

==============shell腳本代碼===============

#!/bin/bash

#FileName:FIND.SH

#Description:為網路知道提供的適用代碼。

#文件總行數:

nLine=$(cat$1|wc-l)

#取第一行中」非ID「字元串。

findStr=$(cat1.txt|sed-n1p|sed's/(^[0-9]*,)(.*$)/2/')

#找出與findStr相匹配的所有行,統一輸出到臨時文件temp中保存等待整理。

cat$1|grep$findStr>temp

#整理temp中的內容,保存到formatTemp臨時文件中。

nLTemp=$(cattemp|wc-l)

foriin$(head-n$((nLTemp-1))temp)

do

printf"$i||">>formatTemp

done

tail-n1temp>>formatTemp

#進入循環處理:

foriin$(cat$1)

do

findStr=$(echo$i|sed's/(^[0-9]*,)(.*$)/2/')

#如果findStr在formatTemp中已經存在了,就跳過這一行。

grep"$findStr"formatTemp>/dev/null

if[$?==0];then

continue

fi

#找出與findStr相匹配的所有行,統一輸出到臨時文件temp中保存等待整理。

cat$1|grep$findStr>temp

#整理temp中的內容,保存到formatTemp臨時文件中。

nLTemp=$(cattemp|wc-l)

foriin$(head-n$((nLTemp-1))temp)

do

printf"$i||">>formatTemp

done

tail-n1temp>>formatTemp

done

#輸出最後的formatTemp內容:

catformatTemp

#做最後的清理工作:

rm-ftempformatTemp

================================

================================

測試文件1.txt內容:

1,Jack,88,beer

2,tom,45,wine

3,Jack,88,beer

4,tom,45,wine

5,Jack,88,beer

6,White,99,beer

7,White,99,beer

8,Rock,100,wine

9,tom,45,wine

10,Rock,100,wine

=========================

輸出結果:

[root@jiajiashellscript]#./find.sh1.txt

1,Jack,88,beer||3,Jack,88,beer||5,Jack,88,beer

2,tom,45,wine||4,tom,45,wine||9,tom,45,wine

6,White,99,beer||7,White,99,beer

8,Rock,100,wine||10,Rock,100,wine

=========================

❺ SHELL 怎麼避免重復檢測日誌文件

#!/bin/bash

if [ -s ./line ] ;then
Oldline=`tail -1 ./line`
awk '{if('$Oldline'<NR) print}' file.log
Endline=`awk 'END{print NR}' file.log`
echo $Endline >> ./line
else
cat file.log
Endline=`awk 'END{print NR}' file.log`
echo $Endline >> ./line
fi
這個腳本比較粗糙,不知是否內能解決你的問題容。

❻ shell 中如何去除後重復項

uniq
-c 在輸出行前面加上每行在輸入文件中出現的次數。
-d 僅顯示重復行。
-f Fields 忽略由 Fields 變數指定的欄位數目。 如果 Fields 變數的值超過輸入行中的欄位數目, uniq 命令用空字元串進行比較。 這個標志和 -Fields 標志是等價的。
-u 僅顯示不重復的行。
-s Characters 忽略由 Characters 變數指定的字元的數目。 如果 Characters 變數的值超過輸入行中的字元的數目, uniq 用空字元串進行比較。 如果同時指定 -f 和 -s 標志, uniq 命令忽略由 -s Characters 標志指定的字元的數目,而從由 -f Fields 標志指定的欄位後開始。 這個標志和 +Characters 標志是等價的。
-Fields 忽略由 Fields 變數指定的欄位數目。 這個標志和 -f Fields 標志是等價的。
+Characters 忽略由 Characters 變數指定的字元的數目。 如果同時指定 - Fields 和 +Characters 標志, uniq 命令忽略由 +Characters 標志指定的字元數目,並從由 -Fields 標志指定的欄位後開始。 這個標志和 -s Characters 標志是等價的。

❼ shell中如何不重復輸出

使用shuf命令,比如:
#!/bin/bash
for i in `shuf -i 1-10`
do
echo $i
done

❽ linux shell 腳本,重復執行命令。

#!/bin/sh
A=find /home/root/main -name 'deal';
chmod +x $A;
nohup $A $;

❾ 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存儲的鍵值實際上是2344。
類似一維數組的成員測試,多維數組可以使用if ( (i,j) in array)這樣的語法,但是下標必須放置在圓括弧中。
類似一維數組的循環訪問,多維數組使用for ( item in array )這樣的語法遍歷數組。與一維數組不同的是,多維數組必須使用split()函數來訪問單獨的下標分量。split ( item, subscr, SUBSEP)。

❿ Linux中如何防止一個Shell腳本被重復執行

設定一個文件鎖,例如/tmp/execed
腳本第一行就判斷它是否存在,若存在直接退出
腳本最後一行做什麼知道了把

熱點內容
丁度巴拉斯情人電影推薦 發布:2024-08-19 09:13:07 瀏覽:886
類似深水的露點電影 發布:2024-08-19 09:10:12 瀏覽:80
《消失的眼角膜》2電影 發布:2024-08-19 08:34:43 瀏覽:878
私人影院什麼電影好看 發布:2024-08-19 08:33:32 瀏覽:593
干 B 發布:2024-08-19 08:30:21 瀏覽:910
夜晚看片網站 發布:2024-08-19 08:20:59 瀏覽:440
台灣男同電影《越界》 發布:2024-08-19 08:04:35 瀏覽:290
看電影選座位追女孩 發布:2024-08-19 07:54:42 瀏覽:975
日本a級愛情 發布:2024-08-19 07:30:38 瀏覽:832
生活中的瑪麗類似電影 發布:2024-08-19 07:26:46 瀏覽:239