Максимальные значения из столбца не приходят при использовании цикла foreach - PullRequest
0 голосов
/ 27 августа 2018

У меня есть два файла, контакты и Output.csv.

Файл "pins" содержит следующую информацию

A
A[0]
A[1]
B[0]
B[1]
C

Файл "Output.csv" содержит следующую информацию

A,10
A[0],9
A[0],11
A[1],8
B[0],19
B[1],2
B[1],60
C,12

Я написал сценарий оболочки, чтобы получить такой вывод (Final_output.csv)

A,10
A[0],11
A[1],8
B[0],19
B[1],60
C,12 
foreach line1 (`cat pins`)
set final_value = `grep -w $line1 Output.csv | cut -d, -f2 | sort | tail -1`
echo "$line1,$final_value" >> Final_output.csv
end 

Но я получаю только значения A и C. Для A [0], A [1], B [0], B [1] значения не приходят. Что не так с кодом?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете использовать join для фильтрации выходного файла только с ключами в файле пинов, а затем с помощью awk найти максимальные значения:

join -t, pins Output.csv | awk -F, '!($1 in max) || $2 > max[$1] {max[$1] = $2} END {for (key in max) print key FS max[key]}'
A,10
C,12
A[0],11
A[1],8
B[0],19
B[1],60

Выход будет неупорядоченным.

Или сделать все это в awk

awk -F, '
    NR == FNR {pin[$1]; next}
    ($1 in pin) && (!($1 in max) || $2 > max[$1]) {max[$1] = $2}
    END {for (key in max) print key FS max[key]}
' pins Output.csv
0 голосов
/ 27 августа 2018
grep 'A[0]' ...

grep интерпретирует [...] выражение как регулярное выражение. От grep manual :

Выражение в скобках - это список символов, заключенных в [и]. Это соответствует любому отдельному символу в этом списке;

Используйте параметр -F, чтобы отключить регулярное выражение в grep.

Поскольку у меня нет csh, мое решение в bash:

cat pins | while IFS= read -r l; do 
     r=$(grep -F "$l" Output.csv | cut -d, -f2 | sort | tail -1)
     echo "$l,$r"
done

Или вы можете, например, сбежать [ с помощью \, используя l=$(sed 's/\[/\\[/g' <<<"$l").

...