2014-10-29 72 views
1

我有3個文件(他們將獲得經過測試階段更多),每片含66線有:使用sed/awk/grep在幾行文件的同一行中查找min?

FIRST=156627343 LAST=156627575 
FIRST=169555944 LAST=169556026 
FIRST=236401800 LAST=236402020 
FIRST=56685918 LAST=56686028 
FIRST=123843179 LAST=123843334 
FIRST=57879358 LAST=57879500 
FIRST=57879358 LAST=57879500 
FIRST=92956620 LAST=92956795 

大多數時候,首先&最後將在每一行的所有文件相同。然而,在某些情況下,會出現差別,如第二個文件的第一行:

FIRST=156627352 LAST=156627575 
FIRST=169555944 LAST=169556026 
FIRST=236401800 LAST=236402020 
FIRST=56685918 LAST=56686028 
FIRST=123843179 LAST=123843356 
FIRST=57879358 LAST=57879500 
FIRST=57879358 LAST=57879500 
FIRST=92956620 LAST=92956795 

我想創建包含最大FIRST和LAST分鐘一個新的文件。我的做法是:

paste -d" " $file1 $file2 $file3 | while read from to; do echo "${from}" "${to}"; done > output.txt 

但是,如何過濾此輸出?

+2

那麼預期產出如何?另外,'comm -3 --nocheck-order f1 f2'就是這樣。 – fedorqui 2014-10-29 12:08:46

+1

'diff'怎麼樣? – nu11p01n73R 2014-10-29 12:11:57

+0

你只有第一行認同嗎?還是所有的線? – 2014-10-29 12:40:18

回答

1

如何像

awk '{ print ( $1 > $3 ? ($1 > $5 ? $1 : $5) : ($3 > $5 ? $3 : $5)), ( $2 < $4 ? ($2 < $6 ? $2 : $6) : ($4 < $6 ? $4 : $6)) }' output.txt 

會給輸出

FIRST=156627352 LAST=156627575 
FIRST=169555944 LAST=169556026 
FIRST=236401800 LAST=236402020 
FIRST=56685918 LAST=56686028 
FIRST=123843179 LAST=123843334 
FIRST=57879358 LAST=57879500 
FIRST=57879358 LAST=57879500 
FIRST=92956620 LAST=92956795 

希望這是你想要

+0

我不這麼認爲。他顯然在尋找兩個文件中不匹配的行。 – fedorqui 2014-10-29 12:35:26

+0

@ nu11p01n73R:非常感謝 - 這正是我想要的。這對我來說是一個很好的模板 - 我會努力解決這個問題,這樣我就可以用多個文件來做到這一點。 – user3401516 2014-10-29 13:07:48

+0

@federoqui:對不起,這樣非常不方便 – user3401516 2014-10-29 13:08:25

3

什麼要遍歷所有文件並找到最小值/最大值:

awk -F'[[:blank:]=]+' ' 
    NR==FNR || $2 < first[FNR] {first[FNR] = $2} 
    NR==FNR || $4 > last[FNR] {last[FNR] = $4} 
    END { 
     for (i=1; i<=FNR; i++) 
      printf "FIRST=%s\tLAST=%s\n", first[i], last[i] 
    } 
' file1 file2 ... 
+0

+1非常優雅,太快了2分鐘!並且,可以一次處理任意數量的輸入文件。 – 2014-10-29 13:04:50

+0

我想知道爲什麼這不適合我。對於每一行,輸出都像「FIRST = \t LAST =」。 – user3401516 2014-10-29 13:39:21

+2

我也想知道,但我需要更多的細節來做任何事情,但不知道。 – 2014-10-29 14:21:34

1

這是一個(而較爲平淡)純猛砸格倫·傑克曼的優秀「的awk」解決方案版本:

declare -i -a min_first=() 
declare -i -a max_last=() 
declare -i line_idx 
declare -i is_first_file=1 
for file in "[email protected]" ; do 
    line_idx=0 
    while IFS=$' \t\n=' read f1 first f3 last || [[ $f1 ]] ; do 
     ((is_first_file || first < min_first[line_idx])) \ 
      && min_first[line_idx]=first 
     ((is_first_file || last > max_last[line_idx])) \ 
      && max_last[line_idx]=last 
     line_idx+=1 
    done <"$file" 

    is_first_file=0 
done 

for ((line_idx=0 ; line_idx < ${#min_first[@]} ; line_idx++)) ; do 
    echo "FIRST=${min_first[line_idx]} LAST=${max_last[line_idx]}" 
done 

它假定要處理的文件列表中已經provded作爲命令行參數(「$ @」) 。

'[[$ f1]]'是爲了確保最後一行在未終止的文件中處理。

我沒有對它進行基準測試,但肯定會比'awk'解決方案慢得多。但是,我希望它足夠快,可以處理多達100個問題中所述大小的輸入文件。

相關問題