непроверено из-за отсутствия входных данных:
gawk '
BEGIN {FS = OFS = "\t"}
BEGINFILE {match(FILENAME, /inputfile_([0-9]+).assoc.logistic/, m)}
FNR == 1 {
key = $1 OFS $2 OFS $3
data[key] = data[key] OFS $7"_"m[1] OFS $8"_"m[1] OFS $9"_"m[1]
next
}
{
key = $1 OFS $2 OFS $3
data[key] = data[key] OFS $7 OFS $8 OFS $9
}
END {
for (key in data) {
print key data[key]
}
}
' inputfile_*.assoc.logistic > outputfile
Так как я перебираю хеш-ключи для вывода данных, вывод будет отображаться в случайном порядке заказ
«Условное выражение» - это то, что используется внутри теста
[
или [[
] команды.
Итак, оба ваших вопроса 1 и 2 означают одно и то же:
Однако они не означают то, что вы думаете:
$ if [[ 1 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ 10 < 2 ]]; then echo yes; else echo no; fi
yes
$ if [[ e < è ]]; then echo yes; else echo no; fi
yes
Это сравнение, как указано в руководстве:
True if string1 sorts before string2 lexicographically.
То есть: в порядке словаря (и зависит от переменной LC_COLLATE)
Тест с простым [
перенаправит вывод в файлы:
$ if [ e < è ]; then echo h; else echo b; fi
bash: è: No such file or directory
b
Чтобы заставить его работать, вам нужно использовать обратную косую черту (процитируйте <и>):
$ if [ e \< è ]; then echo h; else echo b; fi
h
Но я не рекомендую использовать <в тесте
.
В другом месте, где могут использоваться <, <=,>,> =, находятся внутри арифметических тестов, которые могут быть частью теста if:
$ if (( 12 <= 15 )); then echo "yes"; fi
yes
Что, да, эквивалентно:
$ if [[ 12 -le 15 ]]; then echo "yes"; fi
yes
И вполне аналогично:
$ if [ 12 -le 15 ]; then echo "yes"; fi
yes
Итак, да, все это:
<= >= < > comparison
== != equality and inequality
&& logical AND
|| logical OR
Используются для условных выражений внутри арифметических выражений:
$ if (( ( ((2<3)&&(3>7)) * 18 ) == 0 )); then echo "yes"; fi
yes
Это не те же условные выражения, что и внутри команды test
.
Все очень просто. Вы просто должны понять []
, [[]]
и (())
как совершенно разных зверей.
[ выражение ]
- это просто вызов программы [
(просто другое название для test
), которая принимает выражение в качестве аргументов, как и все вызовы команд в bash. Это означает, что вы должны использовать пробелы между аргументами, особенно после [
и перед ]
, ключевые слова и специальные символы должны быть экранированы или заключены в кавычки, а переменные расширяются обычным образом.
Внутри выражения, -gt, -lt
и related используются для числового сравнения, а >, <
и sort - для сравнения строк. Считайте, что [
не имеет никакого отношения к bash, а просто вызывает команду, которая оценивает выражения и возвращает 0 (true) или ненулевое значение (false), как это делают все программы.
Булевы операторы &&
и ||
не могут быть использованы здесь, потому что они интерпретируются bash и не передаются в test
в качестве аргументов. Вместо них используются -a
и -o
. Но вы всегда можете сделать [ test1 ] && [ test2 ] || [ test3 ]
, которые представляют собой три вызова теста, объединенные обычными булевыми операторами bash
(то есть, если первый не сработал, второй пропускается).
Обратите внимание, что bash
все еще поставляется с собственной реализацией [
(builtin), но это не меняет синтаксической трактовки.
[[ ]]
и (( ))
- это не встроенные замены команд, а части специального синтаксиса, поэтому к ним применяются другие правила. Подробнее о том, как там обрабатываются имена переменных с подстановочными знаками, см. страницу man. Булевы операторы &&
и ||
имеют обычное значение.
[[ ]]
ориентирован на строки: все сравнения для строк (но более "современные", локально-зависимые, чем в [
, хотя test
может быть платформо-зависимым). Он также обрабатывает тесты файлов, regex и т.д.
Символ (( ))
предназначен для арифметических выражений. Имена переменных там не требуют $
, и вы можете в основном просто писать там математические выражения - это, конечно, включает сравнения (которые являются числовыми). Сравнение в этом случае ничем не отличается от любого другого арифметического выражения, true - 1, false - 0, и вы можете написать что-то вроде (( x=y*(z>4) ))
. При использовании в условном выражении ненулевое значение будет истинным, а нулевое - ложным. Результат также можно представить в виде $(( ))
.
Итак:
[[ ]]
строковые условия, сопоставление шаблонов и тесты файлов(( ))
арифметические выражения и условия[ ]
тест команда: обрабатывает оба, специальный нестандартный синтаксис для булевых операторов и операторов сравнения