У меня есть файл, содержащий несколько чисел в столбце: (numbers.txt)

2
5
126
3005
65

Есть еще один текстовый файл, который выглядит примерно так: (input.txt)

#    126    2    0
bla    mjnb     kjh    ojj
#    5    65    0
kjh    jhgg    kjhkjh    juh
hgj    ikaw    esd     cdqw
#    100    3005    0
jhgjh    jh    jhjhg    pol

Первые строки важны. Оба числа, написанные после #, должны быть в number.txt, я написал следующий код, но для моего огромного файла требуется несколько недель. My numbers.txt содержит около 2500 чисел.

    #!/bin/bash
    cat numbers.txt | while read first
    do
    for second in $(cat numbers.txt)
    do
    awk -v RS="#" "/ $first    $second / {sub(/^ /,RS);print}"input.txt >> output1.txt
    done
    done

Вывод должен быть:

#    126    2    0
bla    mjnb     kjh    ojj
#    5    65    0
kjh    jhgg    kjhkjh    juh
hgj    ikaw    esd     cdqw

Может кто-нибудь предложить более быстрый способ достижения результата?

3
sahar 24 Апр 2014 в 18:55

2 ответа

Лучший ответ
awk '
    # read the numbers file into the array "num"
    NR == FNR {num[$1]; next} 

    # if this is a "#" line and the first 2 numbers are in "num" set a flag to "true"
    $1 == "#" {p = (($2 in num) && ($3 in num))} 

    # print the current line if the flag is true
    p
' numbers.txt input.txt 
1
glenn jackman 24 Апр 2014 в 15:08

Используя awk, вы можете обойтись без создания вложенных циклов:

awk 'FNR==NR{a[$0];next} $1=="#" && ($2 in a) && ($3 in a) {p=1}
           $1=="#" && (!($2 in a) || !($3 in a)) {p=0} p' file1 file2
#    126    2    0
bla    mjnb     kjh    ojj
#    5    65    0
kjh    jhgg    kjhkjh    juh
hgj    ikaw    esd     cdqw
1
anubhava 24 Апр 2014 в 15:08