Чтобы избежать сортировки, вы можете сделать:
awk 'NR == 1 || $2 > max {number = $1; max = $2}
END {if (NR) print number, max}' < file
или, если входные данные содержат только один столбец, и вы хотите узнать номер строки с максимальным значением:
awk 'NR == 1 || $1 > max {number = NR; max = $1}
END {if (NR) print number, max}' < file
Когда есть так много полей, я склонен предпочесть awk
:
$ awk 'NR==FNR{a[$1]=$2; next}{if($2 in a){$6=a[$2]}}1;' file1 file2
0 098 0 0 0 -9 x
0 099 0 0 0 -9 x
0 100 0 0 0 -9 x
0 101 0 0 0 -9 x
0 102 0 0 0 13.342 x
0 103 0 0 0 7.456 x
0 104 0 0 0 -9 x
0 105 0 0 0 6.453 x
0 106 0 0 0 -9 x
0 106 0 0 0 -9 x
0 107 0 0 0 3.567 x
0 108 0 0 0 4.210 x
NR==FNR{a[$1]=$2; next}
: NR
- номер текущей строки, а FNR
- номер текущей строки текущего файла. При обработке более одного файла эти два параметра будут равны только во время чтения 1-го файла. a[$1]=$2
использует st поле как ключ к массиву, значением которого является 2-е поле.
nextпереходит к следующей строке. Так, это сохранит все значения из
file1в массив
a`.
if($2 in a){$6=a[$2]}
: теперь мы читаем второй файл. Если второе поле этой строки присутствует в массиве a
, установите 6-е поле ($6
) равным тому, что хранилось в a
для второго поля.
1;
: это сокращение для "напечатать эту строку".
Если оба файла отсортированы по ключевым полям (а 6-е поле обычно -9
)
join -1 2 -a 1 -e '-9' -o 1.1 1.2 1.3 1.4 1.5 2.2 1.7 file2 file1
сделайте работу (спасибо steeldriver за исправление)
.
Но более правильным может быть sed`s форматирование:
join -1 2 -a 1 2 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,1.7 |
sed 's/ \S*\( \S\+\)/\1/3'
Если вы предпочитаете awk и уверены, что есть все ключи из file1
в file2
awk '{
a=0
do {
if (a)
print a
getline a <"file2"
split(a,A)
}
while($1 != A[2])
i=0
A[6]=$2
for(i in A)
printf("%s ",A[i++])
print ""
}' file1