【问题标题】:Need to separate information in a text file using grep or awk or sed需要使用 grep 或 awk 或 sed 分隔文本文件中的信息
【发布时间】:2016-04-01 17:36:03
【问题描述】:

我有一个文本文件 fruits.txt,其中包含以下信息:

15 Apples 0
155 Bananas 0
250 Mangoes 0
555 Oranges 0

其中第一列的值为 15、155、250、222 代表水果的数量(计数)
第二列 Apples、Bananas、Mangoes、Oranges 代表水果名称
第三列 0、0、0、 0 代表类型(或一些随机的东西)

我需要根据第一列中水果的数量将 fruits.txt 中的内容提取到其他单独的文件中。

例如,
如果计数在 b/w 1 到 100 之间,则应将其存储在文件 a.txt
同样,b.txt 中的 b/w 101 到 200,
c.txt 中的 b/w 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 获取输出?

【问题讨论】:

  • 300 到 500 之间会发生什么?
  • @karakfa 这只是一个例子兄弟。我不想让它太长。 :)
  • @karafka 关于其他 199 个整数。
  • 我问的原因是,如果您在范围内没有间隙,则可以使用更简单的实现来仅检查其中一个边界。

标签: bash sorting awk grep


【解决方案1】:

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&gt;=1 &amp;&amp; $1&lt;=100,它表示“测试第一个字段以查看它是否在1 到100 之间”。然后我们就重复你剩下的 3 个条件。

最后,它是一个单行,根据您的条件创建 4 个文件。

【讨论】:

  • “d.txt”之前缺少重定向。试图编辑它,被拒绝了!
  • @Brian 已修复!谢谢你的收获:)
【解决方案2】:

此解决方案仅使用 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

【讨论】:

    【解决方案3】:

    在 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
    

    【讨论】:

    • if(a) {...} 语句可以简化为a{...}
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多