2016-05-12 11 views
0

私はのawkを使用してファイル内の重複チャンクを削除/

1つのチャンクのような4つのラインで構成されているファイル内の文字列の重複チャンクを削除したいのsedポイント

終点

電圧数

終了点が重複している場合は、同じ行(?)の重複したチャンクを削除したいと思います。
たとえば、最初と2番目のチャンクの終点は最初の行で同じで、最初のチャンクだけを保持したいとします。したがって、第2のチャンクは第1の行で除去される。

第2行目では、第1チャンクと第3チャンクの終了点は同じで、最初のチャンクを保持します。

INPUT.TXT:

path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_2759 path_sparc_ffu_dp_out_3115 
R_1545/Q R_1541/Q R_1545/Q 
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2] 
0.926208 0.910592 0.905082 
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712 path_sparc_ffu_dp_out_819 
R_1053/Q R_1053/Q R_1053/Q 
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2] 
0.945436 0.945436 0.9435 

のoutput.txt:

path_sparc_ffu_dp_out_1885 path_sparc_ffu_dp_out_3115 
R_1545/Q  R_1545/Q 
dp_ctl_synd_out_low[6]  dp_ctl_synd_out_low[2] 
0.926208  0.905082 
path_sparc_ffu_dp_out_699 path_sparc_ffu_dp_out_712 
R_1053/Q R_1053/Q  
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] 
0.945436 0.945436  

私はAWK/SEDこの作業を行うことができると思います。どんな助けもありがとうございます。

ベスト、

Jaeyoung

+0

uniq文字列のみを表示するユニークを試みましたが、uniqチャンクを表示する方法はわかりませんでした。awkを試しましたが、私はawkの新機能です。だからお願い。任意の提案は高く評価されます。 –

+1

私はこれがよく知られていることを知っていた。 IMHOでは、このアプローチではなく、以前のQ(http://stackoverflow.com/questions/37141953/relocation-strings-using-awk-sed-from-a-index-file)を修正しようとします。この新しいレイアウトは、あなたの問題を理解することをより困難にします。がんばろう。 – shellter

+0

こんにちは@ jaeyoung-park、あなたのすべてのチャンクには重複が含まれているか、またはそれらの一部だけが含まれていますか? –

答えて

1

このソリューションは、あなたの入力データを想定して動作します:

$ sed -r 's/(dp_ctl_synd_out_low\[[0-9]\])(.+)(\1)/\1 \2 -/g' input.txt | paste - - - - | awk '{ $8=="-"?dup=2:dup=3; for(i=1;i<=NF;i++){if(dup!=((i-1)%3+1)){print $i}} }' | paste - - 
path_sparc_ffu_dp_out_1885  path_sparc_ffu_dp_out_3115 
R_1545/Q  R_1545/Q 
dp_ctl_synd_out_low[6] dp_ctl_synd_out_low[2] 
0.926208  0.905082 
path_sparc_ffu_dp_out_699  path_sparc_ffu_dp_out_712 
R_1053/Q  R_1053/Q 
dp_ctl_synd_out_low[2] dp_ctl_synd_out_low[6] 
0.945436  0.945436 

私は次のようにステップにより、溶液のステップを説明します:

は、重複終点を代入マイナス記号付き:

sed -r 's/(dp_ctl_synd_out_low\[[0-9]\])(.+)(\1)/\1 \2 -/g' input.txt 

一列にチャンクを表示:

awkを使用
paste - - - - 

、重複した列(第二又は第三の)除外:

# find if the duplicate is in the second or in the third column 
$8=="-"?dup=2:dup=3; 
# exclude all the seconds or thirds fields (previous calculated) 
for(i=1;i<=NF;i++){ 
    if(dup!=((i-1)%3+1)){ 
     print $i 
    } 
} 

最後paste元の形式でデータを表示する:

paste - - 

私はこれがあなたを助けることを望みます。

関連する問題