需要使用grep或awk或sed

时间:2016-04-01 17:36:04

标签: bash sorting awk grep

我的文字文件 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

中的500到600

期望的输出:

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获取输出的任何想法?

3 个答案:

答案 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