`

用java实现"awk -d"功能(保留多行重复)

    博客分类:
  • Java
阅读更多
一般用过linux脚本的都知道"awk -d"的用法: 只显示有重复数据行,每种重复行只显示其中一行.

而我的需求是希望显示所有的重复行, 而不是只是一行. 因为目前对shell脚本不是很熟练, 下面是java代码的实现,感觉比想象的复杂, 备忘一下:

public class ReadCardCode {
    public static void main(String[] args) throws Exception {
        BufferedReader reader =
                new BufferedReader(new FileReader("sort.log"));
        BufferedWriter writer1 =
                new BufferedWriter(new FileWriter("result.log"));
        BufferedWriter writer2 =
                new BufferedWriter(new FileWriter("result-2.log"));
        int count = 6;
        int i = 0;
        String current = null;
        String curItemId = null;
        // 将同一商品的所有记录取出放到一边, 如果这些记录大于1则说明有重复, 输出. 否则抛弃
        List<String> lineList = new ArrayList<String>(10);
        try {
            while ((current = reader.readLine()) != null) {
                String[] curArray = current.split(" ");
                if (curItemId == null) { // 首行
                    lineList.add(current);
                } else { // 下一行
                    if (curArray[2].equals(curItemId)) { // 相同行加入列表
                        lineList.add(current);
                    } else {
                        writeLineList(writer1, writer2, lineList);
                        // 下一轮首行
                        lineList.clear();
                        lineList.add(current);
                    }
                }

                curItemId = curArray[2];

                // if (i++ > 6) {
                // break;
                // }
            }
            writeLineList(writer1, writer2, lineList);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                writer2.close();
                writer1.close();
            } catch (Exception ee) {
                ee.printStackTrace();
            }
        }
    }

    private static void writeLineList(BufferedWriter writer, BufferedWriter writer2, List<String> lineList)
            throws IOException {
        if (lineList.size() > 1) { // 输出前面相同行
            for (String line : lineList) {
                write(writer, writer2, line);
            }
        }
    }

    private static void write(BufferedWriter writer, BufferedWriter writer2, String str) throws IOException {
        BufferedWriter w = writer;
        // String[] curArray = str.split(" ");
        // String itemId = curArray[2].replace("itemId=", "");
        // long route = Long.valueOf(itemId) % 2;
        // if (route == 1) {
        // w = writer;
        // } else {
        // w = writer2;
        // }
        w.write(str);
        w.newLine();
        w.flush();
    }
}
分享到:
评论
2 楼 night_stalker 2010-06-08  
用 stdio 更通用
gets("\0").lines.group_by{|l|l[/:.+/]}.each{|_,v|puts v if v[1]}


调用:
ruby p.rb < sort.log > result.log
1 楼 RednaxelaFX 2010-06-07  
也就是说Ruby脚本的话:
open('result.log', 'w') {|f| File.readlines('sort.log').group_by {|l| l.split[2]}.each {|_, v| f << v if v.size > 1} }

相关推荐

    MOXA_AWK-3121配置方法及要点说明

    MOXA AWK-3121 是一种工业级无线设备,具有 web 功能配置、IP 网络参数设置、工作模式选择、功率增强等特点。本文将详细介绍 MOXA AWK-3121 的配置方法及要点说明。 一、Web 功能配置 MOXA AWK-3121 的 web 功能...

    无线AP藦萨AWK-3131A

    Moxa AWK-3131A 三合一工业级无线AP/Bridge/Client 支 持IEEE 802.11n 技术,数据传输率高达300Mbps,满足了 不断增长的快速数据传输和信号覆盖范围更广泛的要求。 AWK-3131A 符合各种工业标准,包括工作温度、输入...

    AWK-4121介绍

    ### AWK-4121系列室外无线AP/网桥/客户端关键技术知识点 #### 一、产品概述 AWK-4121是一款专为工业级应用设计的室外无线接入点/AP、网桥及客户端三合一设备。它适用于不易布线、布线成本较高或者需要在移动TCP/IP...

    awk-思维导图

    awk-思维导图

    moxa AirWorks AWK-1137C User’s Manual

    摩沙AP用戶手冊

    awk使用手册

    - awk虽然不专门用于排序,但结合其他工具可以实现排序功能。 #### 五、awk的应用场景 1. **日志分析**: - awk非常适合处理日志文件,提取关键信息,如IP地址、访问时间等。 2. **数据提取**: - 从复杂的...

    awk-培训.docx

    在Linux系统中,awk是一...通过这些基本操作,你可以实现条件查询、去重和分组等功能,这些功能类似于SQL中的SELECT、DISTINCT和GROUP BY等操作。awk的灵活性和强大功能使得它在文本处理和数据分析领域具有很高的价值。

    awk教程--别人家的笔记

    ### awk教程知识点详解 #### 一、awk简介 - **定义**:`awk`是一种用于文本数据处理的强大工具,属于解释型编程语言。 - **用途**:主要用于数据分析、报告生成等场景,尤其适用于处理结构化的文本文件。 #### 二...

    GNU Awk - 中文版1

    GAWK是完全符合POSIX标准的awk实现,提供了更多的功能和灵活性。 本书的核心内容包括AWK的编程规范、语法和使用技巧。AWK的工作原理是通过正则表达式匹配输入中的模式,并根据匹配情况执行相应的动作。这种数据驱动...

    Vim-101-hacks、Sed-and-Awk-101-Hacks、Linux-101-hacks 英文版(高清)PDF

    通过awk,你可以方便地处理CSV文件,进行数据分析,甚至实现简单的脚本任务。 4. Linux-101-hacks:Linux操作系统是开源的,提供了丰富的命令行工具和强大的系统管理功能。这个主题可能包括常用命令的使用,如ls、...

    AWK-file.rar_awk_awk tcl_delay awk_jitter awk _jitter ns-2

    这个名为"AWK-file.rar_awk_awk tcl_delay awk_jitter awk _jitter ns-2"的压缩包文件显然是针对网络性能分析的,特别是使用AWK进行分析。下面将详细介绍涉及的知识点。 1. **AWK**: AWK是一种编程语言,由Aho、...

    awk-sed高级练习题pdf

    - **解析**:使用正则表达式匹配第一个和第二个单词,`\1\3` 表示保留第一个和第三个捕获组,即保留了第一个单词及之后的部分,去除了第二个单词。 6. **删除一个文件的每行中的倒数第2个单词** ```shell sed 's...

    sed and awk 101 hacks.pdf

    - **引用数组元素、使用循环遍历awk数组、删除数组元素、多维数组、SUBSEP下标分隔符、用asort为数组排序、用asorti为索引排序**:Awk的关联数组是处理文本数据的强大工具,它允许使用任意字符串作为数组的索引。...

    awk-script.zip_NS2 awk_awk_ns2_awk_trace

    在`awk script`这个压缩包中,只有一个名为"awk script"的文件,这可能是实现上述功能的`awk`源代码。实际使用时,我们需要将这个脚本与`ns2`的追踪文件一起运行,通常通过命令行执行,如: ``` awk -f awk_script ...

    all-awk.rar_All.awk_NS2仿真_all awk_awk_awk-scripts

    总之,"all-awk.rar"提供的"All.awk"脚本是NS2仿真数据分析的一个实用工具,它利用AWK的强大功能,简化了对复杂网络模拟数据的处理过程。对于网络研究人员和工程师来说,掌握AWK和NS2的结合使用,不仅可以提高工作...

    awk使用手册awk使用手册

    - **printf 函数**:使用 `printf` 函数可以对输出进行格式化控制,如 `%03d` 表示输出一个宽度至少为 3 的数字,不足部分用 0 填充。 4. **条件判断和循环** awk 支持各种逻辑判断和循环结构,如 `if`、`for`、...

    awk--Linux awk 命令-基础知识概要

    AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首 字符。

    linux-awk-完全手册范本.doc

    awk 的调用方式有三种:一是使用 awk 命令行,二是使用-f 选项调用 awk 程序,三是利用命令解释器调用 awk 程序。awk 程序设计语言可以完成 grep 和 sed 所能完成的全部工作,并且具有样式装入、流控制、数学运算符...

Global site tag (gtag.js) - Google Analytics