使用foreach循环时,列中的最大值不会出现

时间:2018-08-27 13:21:09

标签: linux foreach grep csh

我有两个文件,即pin和Output.csv。

文件“图钉”包含以下信息

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

我已经编写了一个shell脚本,以获得这样的输出(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 :(得分:2)

您可以使用join仅使用pins文件中的键来过滤输出文件,然后使用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

答案 1 :(得分:0)

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")进行转义。