我的文字文件 fruits.txt 包含以下信息:
15 Apples 0
155 Bananas 0
250 Mangoes 0
555 Oranges 0
其中第一列的值为15,155,250,222表示水果的数量(计数)
第二列苹果,香蕉,芒果,橙子代表水果名称第三列0,0, 0,0代表类型(或一些随机的东西)
我需要根据第一栏中的水果数量将 fruits.txt 中的内容提取到其他单独的文件中。
例如,
如果计数是b / w 1到100,则应将其存储在 a.txt 文件中
同样,b = w 101到200 b.txt ,b / w 201到300 c.txt 和
b / w d.txt
期望的输出:
a.txt应具有以下内容:
15 Apples 0
b.txt as:
155 Bananas 0
c.txt as:
250 Mangoes 0
d.txt as:
555 Oranges 0
使用sed或awk或grep获取输出的任何想法?
答案 0 :(得分:3)
Awk在这里工作得很好:
awk '$1>=1 && $1<=100 {print > "a.txt"} $1>=101 && $1<=200 {print > "b.txt"} $1>=201 && $1<=300 {print > "c.txt"} $1>=500 && $1<=600 {print > "d.txt"}' fruits.txt
这可以通过指定在每个{}
块内打印行的位置,并在每个块前添加条件来限制哪些记录到达块。对于第一个文件a.txt
,我们使用条件$1>=1 && $1<=100
表示&#34;测试第一个字段以查看它是否介于1和100之间#34;。然后我们重复你剩下的3个条件。
最后,它是一个根据您的条件创建4个文件的单行。
答案 1 :(得分:1)
在sed和grep中做数学很难。 这样就离开了。 (我宁愿使用perl。)
这些要求很奇怪。
我做这样的事情:
awk '{ if (0 < $1 && 101 > $1) { print $0 > "a.txt" } }
{ if (100 < $1 && 201 > $1) { print $0 > "b.txt" } }
{ if (200 < $1 && 301 > $1) { print $0 > "c.txt" } }
{ if (499 < $1 && 601 > $1) { print $0 > "d.txt" } }' fruits.txt
答案 2 :(得分:1)
此解决方案仅使用Bash。它执行基本的错误处理。
# Initialize output files
for outfile in a.txt b.txt c.txt d.txt ; do
echo >$outfile
done
while IFS= read -r line || [[ -n $line ]] ; do
read -r count rest <<<"$line"
if (( count <= 1 )) ; then
echo "ERROR - Invalid count in '$line'" >&2
elif (( count < 100 )) ; then
printf '%s\n' "$line" >> a.txt
elif (( count <= 101 )) ; then
echo "ERROR - Invalid count in '$line'" >&2
elif (( count < 200 )) ; then
printf '%s\n' "$line" >> b.txt
elif (( count <= 201 )) ; then
echo "ERROR - Invalid count in '$line'" >&2
elif (( count < 500 )) ; then
printf '%s\n' "$line" >> c.txt
elif (( count <= 501 )) ; then
echo "ERROR - Invalid count in '$line'" >&2
elif (( count < 1000 )) ; then
printf '%s\n' "$line" >> d.txt
else
echo "ERROR - Invalid count in '$line'" >&2
fi
done < fruits.txt