我有一个文件test.txt,如下所示:
2092 Mary
103 Tom
1239 Mary
204 Mark
1294 Tom
1092 Mary
我正在尝试创建一个shell脚本
读取每一行并将两列中的数据放入变量var1和var2中
如果每行中的var2相同,那么在这些行中添加var1。
将文件输出为文本文件。
结果应该是var2列中的唯一值。以下是我目前掌握的情况:
#!/bin/sh
#!/usr/bin/sh
cat test.txt| while read line;
do
$var1=$(echo $line| awk -F\; '{print $1}')
$var2=$(echo $line| awk -F\; '{print $2}')
如何引用每行中的变量并进行比较?
预期产出将是:
4423 Mary
1397 Tom
204 Mark
最佳答案
使用awk
很容易:
awk '{sum[$2] += $1} END {for (i in sum) printf "%4d %s\n", sum[i], i; }'
如果要使用
bash
4.x(而不是3.x)来执行此操作,则:declare -A sum
while read number name
do
((sum[$name] += $number))
done
for name in "${!sum[@]}"
do
echo ${sum[$name]} $name
done
这里的结构基本上与
awk
脚本同构,但不太方便。它将从标准输入读取,使用名称作为关联数组的索引。sum
符号在手册的Shell Parameter Expansion一节中有描述,甚至在Arrays一节中也没有暗示。如果你知道去哪里找,信息就在那儿。如果要处理任意数量的输入文件(如
${!sum[@]}
脚本),则需要使用awk
来收集数据:cat "$@" |
{
declare -A sum
while read number name
do
((sum[$name] += $number))
done
for name in "${!sum[@]}"
do
echo ${sum[$name]} $name
done
}
这不是UUOC因为它不处理任何参数(读取标准输入)、一个参数或多个参数。
对于所有脚本,如果要按编号或名称顺序对输出进行排序,请对脚本的输出应用适当的
cat
:script file1 file2 file3 | sort -k 1,1n # By sum increasing order
script file1 file2 file3 | sort -k 1,1nr # By sum decreasing order
script file1 file2 file3 | sort -k 2,2 # By name increasing order
script file1 file2 file3 | sort -k 2,2r # By name decreasing order
关于linux - Linux Shell脚本将列读入变量,然后添加属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15531525/