使用 foreach 循环时不会出现列的最大值
Maximum values from column is not coming while using foreach loop
我有两个文件,pin 和 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
我写了一个 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] 值没有出现。代码有什么问题?
grep 'A[0]' ...
grep 将 [...]
表达式解释为正则表达式。来自 grep manual:
A bracket expression is a list of characters enclosed by [ and ]. It
matches any single character in that list;
使用 -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")
.
将 [
转义为 \
您可以使用 join
仅使用 pins 文件中的键过滤输出文件,然后使用 awk 查找最大值:
join -t, pins Output.csv | awk -F, '!( in max) || > max[] {max[] = } 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[]; next}
( in pin) && (!( in max) || > max[]) {max[] = }
END {for (key in max) print key FS max[key]}
' pins Output.csv
我有两个文件,pin 和 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
我写了一个 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] 值没有出现。代码有什么问题?
grep 'A[0]' ...
grep 将 [...]
表达式解释为正则表达式。来自 grep manual:
A bracket expression is a list of characters enclosed by [ and ]. It matches any single character in that list;
使用 -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")
.
[
转义为 \
您可以使用 join
仅使用 pins 文件中的键过滤输出文件,然后使用 awk 查找最大值:
join -t, pins Output.csv | awk -F, '!( in max) || > max[] {max[] = } 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[]; next}
( in pin) && (!( in max) || > max[]) {max[] = }
END {for (key in max) print key FS max[key]}
' pins Output.csv