繁体   English   中英

需要使用grep或awk或sed分隔文本文件中的信息

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM