[英]Need to separate information in a text file using grep or awk or sed
我有一个文本文件fruits.txt,其中包含以下信息:
15 Apples 0
155 Bananas 0
250 Mangoes 0
555 Oranges 0
其中具有值15、155、250、222的第一列表示水果数(计数)
第二列苹果,香蕉,芒果,橙子代表水果名称
第三列0、0、0、0代表类型(或一些随机的东西)
我需要根据第一栏中水果的数量,将fruits.txt中的内容提取到其他单独的文件中。
例如,
如果计数在黑白1到100之间,则应将其存储在文件a.txt中
同样, b.txt中的黑白101到200,
c.txt中为 201至300的黑白,并且
d.txt中黑白至500至600
所需的输出:
a.txt的内容应为:
15 Apples 0
b.txt为:
155 Bananas 0
c.txt为:
250 Mangoes 0
d.txt为:
555 Oranges 0
有什么想法使用sed或awk或grep获取输出吗?
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
,条件$1>=1 && $1<=100
“测试第一个字段以查看它是否在1到100之间”。 然后,我们只重复您剩余的3个条件。
最后,它是一个单行代码,可根据您的条件创建4个文件。
在sed和grep中很难进行数学运算。 因此,留下awk。 (我宁愿使用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
此解决方案仅使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.