Столбец печати, если значения между двумя другими значениями

Хотя архитектура является тем же, и это сообщение обычно указывает, что двоичный файл для внешней архитектуры, реальное значение этого сообщения состоит в том, что это связано против несовместимой библиотеки времени выполнения C.

См. это сообщение на Linux С нуля веб-сайт. В его случае, обновляющем glibc, дал ему эту ошибку для нескольких (но не все) команды.

Необходимо будет установить надлежащую библиотеку времени выполнения C, которая соответствует двоичному файлу, или получите двоичный файл, который соответствует библиотеке времени выполнения C.

2
10.02.2014, 18:47
3 ответа

Это сделает то, что я думаю, что Вы просите. Это собирает все значения из 4-го столбца и затем для всех строк в файле и всех значений, замеченных на четвертом столбце, это распечатает строку, если какое-либо из 4-х значений будет между значениями на строке.

perl -lane '$want{$F[$#F]}++; foreach $wanted (keys(%want)){
               if($wanted > $F[1] && $wanted < $F[2]){print "@F[0..2]"} 
             }' file
A 1 10
C 100 1000
D 1000 10000

Однако как Вы видите выше, это не производит вывод, который Вы показываете. Это печатает строку C потому что 100 <120 <1000 и это не печатает строку E, потому что ни одно из значений 4-го столбца не между 10 000 и 100000.


Объяснение

-a переключатель к perl заставляет его автоматически разделить входной файл на поля на пробеле и сохраняет поля как массив @F. Так, я сохраняю последнее поле ($F[$#F]) в %wanted хеш, и для каждой строки, я прохожу ключи хеша, который я имею до сих пор и печатаю 1-е через 3-и поля (@F[0..2]) из строки, если какой-либо из них между значениями.

Обратите внимание, что это не будет работать, если Ваш файл не будет заказан, если бы одни из 4-х номеров столбцов могут появиться после строки он удовлетворил бы. Если это может произойти, необходимо считать файл дважды, что-то вроде этого:

 perl -le 'open(A,"$ARGV[0]"); while(<A>){@F=split(/\s+/); $want{$F[$#F]}++}; 
           open(A,"$ARGV[0]"); while(<A>){@F=split(/\s+/);
            foreach $wanted (keys(%want)){
                if($wanted > $F[1] && $wanted < $F[2]){print "@F[0..2]"}
            }} ' file

Или, можно использовать ответ @Stephane, который также читает файл дважды.

3
27.01.2020, 21:52
  • 1
    Это было точно, что я искал. Миллион благодарностей для этого и извините снова для беспорядка прежде, из-за моего неправильного примера. –  Thomas 10.02.2014, 18:52
awk 'NR == FNR {if (NF >= 4) a[$4]; next}
     {for (i in a) if (+i >= $2 && +i <=$3) {print $1, $2, $3; next}}' file file
3
27.01.2020, 21:52
  • 1
    Работы, одинаково хорошие для меня как ответ terdon выше. Большое спасибо за Вашу справку и время. –  Thomas 10.02.2014, 18:57

что-то вроде этого?

awk '$4 <= $3 && $4 >= $2' data
A 1 10 5

без 4-го столбца:

awk '($4 <= $3 && $4 >= $2){print $1,$2,$3}' data
A   1   10
1
27.01.2020, 21:52
  • 1
    Это в значительной степени точно, что OP имеет в вопросе. Между прочим, Вам не нужно " " между печатными полями просто запишите {print $1,$2,$3}. –  terdon♦ 10.02.2014, 17:10
  • 2
    @terdon, большое спасибо, я не эксперт в awk. –   10.02.2014, 17:11

Теги

Похожие вопросы