Исключить символы в awk при расчете минимума - PullRequest
1 голос
/ 16 марта 2020

Ниже приведен набор данных, который у меня есть

10.25 3.5
10.15 4.5
# value1 
10.25 3.5
12.15 4.5
11.25 3.5
10.05 4.5

Я попытался найти минимальный столбец column1 с

awk 'NF' FILENAME |sort -k1 - | awk 'NR==1{print $1}' 

, но в итоге я получил

#

как результат. Я также пытался с -F "| #" .. но результат тот же. Мое ожидаемое выходное значение - это минимальное значение column1

10.05

У меня есть файлы данных с числовыми и специальными символами столбцов. Я бы сейчас wi sh по ger Min из каждого файла

Желаемый вывод

10.05(from file1)
 9.02 (from file2)

 ..... (from n files)

Мой вопрос: как игнорировать строки с такими символами и получать значения All min из каждого файла?

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 марта 2020
awk '($1+0) == $1{print $1, "(from " FILENAME ")"}' file* | sort -k2 -k1,1n | uniq -f1

например:

$ cat file1
10.25 3.5
10.15 4.5
# value1
10.25 3.5
12.15 4.5
11.25 3.5
10.05 4.5

$ cat file2
10.25 3.5
10.15 4.5
# value1
10.25 3.5
12.15 4.5
11.25 3.5
10.05 4.5

$ cat file3
10.25 3.5
10.15 4.5
# value1
10.25 3.5
12.15 4.5
11.25 3.5
10.05 4.5

.

$ awk '($1+0) == $1{print $1, "(from " FILENAME ")"}' file{1..3}
10.25 (from file1)
10.15 (from file1)
10.25 (from file1)
12.15 (from file1)
11.25 (from file1)
10.05 (from file1)
10.25 (from file2)
10.15 (from file2)
10.25 (from file2)
12.15 (from file2)
11.25 (from file2)
10.05 (from file2)
10.25 (from file3)
10.15 (from file3)
10.25 (from file3)
12.15 (from file3)
11.25 (from file3)
10.05 (from file3)

.

$ awk '($1+0) == $1{print $1, "(from " FILENAME ")"}' file{1..3} | sort -k2 -k1,1n
10.05 (from file1)
10.15 (from file1)
10.25 (from file1)
10.25 (from file1)
11.25 (from file1)
12.15 (from file1)
10.05 (from file2)
10.15 (from file2)
10.25 (from file2)
10.25 (from file2)
11.25 (from file2)
12.15 (from file2)
10.05 (from file3)
10.15 (from file3)
10.25 (from file3)
10.25 (from file3)
11.25 (from file3)
12.15 (from file3)

.

$ awk '($1+0) == $1{print $1, "(from " FILENAME ")"}' file{1..3} | sort -k2 -k1,1n | uniq -f1
10.05 (from file1)
10.05 (from file2)
10.05 (from file3)
2 голосов
/ 16 марта 2020

Вы можете использовать этот awk:

awk 'FNR==1 {
   if (min != "")
      print min, "(from", fn ")"
   min = ""
   fn = FILENAME
}
$1+0 == $1 && (min=="" || $1 < min) {
   min=$1
}
END {
   print min, "(from", fn ")"
}' *.txt

10.05 (from file1.txt)
9.02 (from file2.txt)
  • $1+0 == $1 проверьте, чтобы $1 было цифрой c поле
  • (min=="" || $1 < min): устанавливает min=$1, если min не установлено или если $1 < min
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...