首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有一个Bash函数可以让我从文件中分离/删除/隔离行,当它们具有相同的第一个单词时

在Bash中,你可以编写一个函数来处理文件中的行,以便根据每行的第一个单词进行分组并删除重复的行。以下是一个简单的Bash函数示例,它读取一个文件,并输出一个新的文件,其中包含了没有重复第一个单词的行:

代码语言:txt
复制
#!/bin/bash

# 函数:remove_duplicates_by_first_word
# 参数:输入文件路径 输出文件路径
remove_duplicates_by_first_word() {
  input_file="$1"
  output_file="$2"
  declare -A seen

  while IFS= read -r line; do
    first_word="$(echo "$line" | awk '{print $1}')"
    if [[ ! -v seen["$first_word"] ]]; then
      seen["$first_word"]=1
      echo "$line" >> "$output_file"
    fi
  done < "$input_file"
}

# 使用示例
remove_duplicates_by_first_word "input.txt" "output.txt"

这个函数remove_duplicates_by_first_word接受两个参数:输入文件的路径和输出文件的路径。它会创建一个关联数组seen来跟踪已经遇到的第一个单词。然后,它逐行读取输入文件,提取每行的第一个单词,并检查该单词是否已经在seen数组中。如果不在,它会将该行追加到输出文件中,并将第一个单词添加到seen数组中。

应用场景

这个函数可以用于任何需要根据文本文件中每行的第一个单词去重的场景。例如,你可能有一个日志文件,其中包含重复的事件记录,每个记录的第一个单词代表事件类型,你希望删除重复的事件类型记录。

注意事项

  • 这个函数假设每行的第一个单词是由空白字符(如空格或制表符)分隔的。
  • 输入文件应该存在并且可读,输出文件路径应该是可写的。
  • 这个函数不会修改原始文件,而是创建一个新的输出文件。

参考链接

  • Bash官方文档:https://www.gnu.org/software/bash/manual/bash.html
  • Awk官方文档:https://www.gnu.org/software/gawk/manual/gawk.html

请确保在使用这个函数之前备份你的数据,以防万一出现意外情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux系统开发: 学习linux三剑客(awk、sed、grep)(上)

egrep是grep扩展,支持更多re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式元字符表示回其自身字面意义,不再特殊。...-c 只计算显示符合范本样式行数,不显示详细内容 -d 指定要查找是目录而非文件,必须使用这项参数,否则grep命令将回报信息并停止动作。...-f 指定范本文件,其内容有一个或多个范本样式,grep查找符合范本条件文件内容,格式为每一列范本样式。 -F 将范本样式视为固定字符串列表。...n 读取下一个输入行,用下一个命令处理新而不是用第一个命令。 N 追加下一个输入行到模板块后面并在二者间嵌入一个,改变当前行号码。 p 打印模板块。...前跟非零数字,表示后面的命令对所有没有被选定发生作用 需用到命令:G:获得内存缓冲区内容,并追加到当前模板块文本后面 需用到命令:h: 拷贝模板块内容到内存缓冲区 需用到命令:d :删除

9.3K21

深入了解定制 Bash | Linux 中国

Bash 在非交互模式下运行例子是,命令和数据文件或 shell 脚本通过 管道 传送到 Bash 。...理解这些操作模式,有助于帮助我们修改启动文件。 根据 Bash 参考手册,它会: 文件...、作为 -c 调用选项传入参数字符...,或者用户终端读取输入。...image.png 登录 shell 正常退出,如果~/.bash_logout和/etc/bash_logout存在,它们会被调用。...=-1 HISTFILESIZE=-1 上面例子 direxpand 选项,可以 Bash文件名补全,用单词展开结果替换目录名。...重复、以空白打头,都能通过该选项将它们从命令历史过滤掉。引用自 Dusty Mabe,这是他那儿得到技巧: ignoredup 可以历史不记录重复条目(如果你反复执行同一条命令)。

1.1K30
  • linux中最为常用三大文本(grep,sed,awk)处理工具

    默认不会直接修改源文件数据,而是会将数据复制到缓冲区,修改也仅限于缓冲区数据 3. sed 与 vi 区别 vi 采用是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据文本...处理,把当前处理存储在临时缓冲区,成为"模式空间",接着用sed命令处理缓冲区内容,处理完成后,把缓冲区内容送往屏幕。接着处理下一,这样不断重复,直到文件末尾。...,i 命令表示在指定前面插入一它们基本格式完全相同 格式为: [#]a(或 i)\新文本内容 6.3.1 sed ‘3i you are beautiful’ test [3i 指定之前插入...,即 inchars 第一个字符会被转换为 outchars 第一个字符, 第二个字符会被转换成 outchars 第二个字符… 这个映射过程会一直持续到处理完指定字符。...; 它可以在命令行中使用,但更多是作为脚本来使用; awk有很多内建功能,比如数组、函数等,这是它和C语言相同之处; 灵活性是awk一大优势。

    6K10

    sed & awk 第二版学习(三)—— 编写 sed 脚本

    删除输入最后一: $d 正则表达式作为地址提供,命令只影响于这个模式匹配。正则表达式必须封闭在斜杠(/)。...删除第一直到第一个空行所有: 1,/^$/d 可以第一个地址看做是启动动作,并把第二个地址看做是禁用动作。sed 没办法先行决定第二个地址是否会匹配。...一旦匹配了第一个地址,这个动作就将应用于这些,于是命令应用于所有随后直到第二个地址被匹配。上例如果没有空行,那么将删除所有。...d sed 使用大括号({})将一个地址嵌套在另一个地址,或者在相同地址上应用多个命令。如果想指定范围,然后在这个范围内指定另一个地址,则可以嵌套地址。...测试文件小示例开始。在示例上运行脚本并且确信脚本能正常工作。记住,确保脚本在不想它工作地方不能工作同样重要。然后增加示例规模,试着增加输入复杂性。

    6410

    日拱一卒,麻省理工教你CS基础,那些酷炫无比命令行工具

    同样,bash也有可以接收参数函数,并且可以执行。下面是一个函数创建一个文件夹并且cd进入例子。...将会删除foo1, foo2而rm foo*将会删除除了bar之外所有的 花括号{} - 当你命令拥有一系列共同单词,你可以使用花括号来扩展。尤其是移动或者是转变文件时候。...shell函数和脚本存在一些差异,你需要牢牢记住: shell函数需要是相同语言编写,而脚本可以是任何语言写。...个人经常使用-c来获取匹配上下文,以及-v来翻转过滤,比如说打印出所有没有匹配上内容。...然而,如果我们想要对所有文件做一些操作,比如说创建一个zip文件,我们该怎么操作呢?就像你看到一样,命令参数和STDIN接收输入,使用管道,我们将STDOUT和STDIN结合起来。

    1.6K40

    拿起Python,防御特朗普Twitter!

    我们可以使用len函数计算列表项数。在第4和第5,我们打印前面步骤结果。注意第5str函数。为什么在那里?...这段代码一个改进是它结构更好:我们尝试将代码不同逻辑部分分离到不同函数函数是用def关键字定义,后跟着一个函数名,后面跟着圆括号零个或多个参数。...步骤四 我们代码仍然存在一些明显缺陷。例如,我们可以假设一个名词,无论是单数还是复数,都具有相同值。...此外,如果我们可以将所有模块安装在代码所在同一目录,则只需复制该目录并在不同机器上运行。 因此,我们创建一个虚拟环境开始。 首先,确保与代码所在文件相同。然后在终端输入以下内容: ?...2、提供“North”,下一个单词几乎总是“Korea”,后面通常是一些否定句。 3、以“Omaga is”开头句子往往具有负面含义。 ? ?

    5.2K30

    Linux常用命令09 - sed

    在处理文本文件,通常需要在一个或多个文件查找和替换文本字符串。 sed 是一个流编辑器。 它可以文件和输入流(如管道)执行基本文本操作。...使用 sed,您可以搜索、查找和替换、插入和删除单词。 它支持基本和扩展正则表达式,允许您匹配复杂模式。 接下来, 将使用 sed 查找和替换字符串。...还将向您展示如何执行递归搜索和替换。 查找和替换字符串sed sed 有几个版本,它们之间有一些函数差异。...默认情况下一地读取文件,只更改第一次出现SEARCH_REGEX,提供替换标志,所有出现情况都将被替换 INPUTFILE 要在其上运行命令文件名 最好在参数周围加上引号,这样 shell...看一些示例,说明如何使用 sed 命令搜索文件文本,并使用其中一些最常用选项和标志替换文件文本。

    2.1K30

    命令行上数据科学第二版 四、创建命令行工具

    命令行工具优点是您不必记住整个一程序,并且如果您将它包含到其他管道,它会提高可读性。在这个意义上,你可以把命令行工具想象成类似于编程语言中一个函数。...命令行工具具有两个世界优点:它们可以从命令行使用,接受参数,并且只需创建一次。在这一章,你将熟悉用两种方式创建命令行工具。首先,解释了如何将这些一程序转换成可重用命令行工具。...输入数据在工具本身是固定。最好将数据从命令行工具中分离出来。 如果我们假设命令行工具用户将提供文本,那么该工具将变得普遍适用。因此,解决方案是脚本删除curl命令。...输入数据是有限,比如一个文件,这并不是一个问题。但是,输入数据是一个不间断,这样阻塞命令行工具是没有用。 幸运是 Python 和 R 支持处理流数据。例如,您可以逐行应用函数。...4.5 进一步探索 工具需要记住许多选项,向工具添加帮助文档就变得非常重要,尤其是您希望与他人共享您工具。是一个语言无关框架,提供帮助并定义您工具可以接受可能选项。

    2.2K40

    第三十一章 : 疑难排解

    ,并从跟随第一个 echo 命令参数删除其末尾双引号: #!...由于删除了分号,单词 then 被添加到参数列表语法上讲,这是合法。随后 echo 命令也是合法。它被解释为命令列表一个命令,if将会计算命令 退出代码。...本质上来说,这两代码没有任何问题,只要是变量 dir_name存储目录名字存在就可以。但是如果不是这样会发生什么事情呢?...在那种情况下,cd 命令会运行失败,脚本会继续执行下一代码,将会删除当前工作目录所有文件。完成不是期望结果!由于这种设计策略,这个倒霉管理员销毁了服务器一个重要部分。...我们把提示信息输出到标准错误输出,标准输出中分离出来。我们也没有缩进包含提示信息语句,这样想要删除它们时候,能比较容易找到它们

    29010

    Linux基础命令行使用技巧

    比如,通过把具有相同逻辑代码抽象成函数,从而能够加以反复调用。...(重点) 描述:我们即将执行命令与之前命令具有相同参数,比如同样文件名、路径名等等,此时我们可以采用下面的方法进行重复利用上次执行参数值; 基础示例: 1.引用最后一位参数 12345678910...h 向左移动一个字符 l 往右移动一个字符 b 向左移动一个单词 w 往右移动一个单词 e 移到单词结尾 B、W、E 与 b、w、e 类似,按不同单词定义进行移动 0 移到首 ˆ 移到首,但第一个字符为非空白字符...x 删除光标下字符 X 删除光标左边字符 dm m 为某个移动指令,如 db 删除光标左边单词 ,dl则是删除光标右边单词(值得学习) D 光标处删除到行尾 dd 删除整行内容 注意:通过删除命令删除内容...off # 如果设置,且readline正被使用,正在完成一个包含@bash将试图执行主机名补全 huponexit off interactive_comments on #在一个交互式

    5.8K63

    Bash脚本编程(原创)

    然后它会依次寻找~/.bash_profile,~/.bash_login,和~/.profile,读入并执行第一个存在且可读文件。--noprofile参数可以阻止bash启动这种行为。...一个登录shell退出bash读取并执行~/.bash_logout文件,如果此文件存在。一个交互非登录shell启动后,bash读取并执行~/.bashrc文件。...-a array 将单词清单放入 array 数组 first last 读取输入到第一个空格或回车,将输入第一个单词放入 first ,而其他则放在 last -p prompt 打印提示...如果一个陷阱被定义为函数,它就可以被脚本共享,但可能产生意想不到效果。 9、如果函数保存在其他文件,必须通过 source 或者 dot 命令把它们装入当前脚本。...5.3、source(或者 dot)命令 函数通常被定义到.profile 需要使用函数可以使用 source 或者 dot 加文件名来激活这些在文件定义函数

    1.4K30

    Linux基础命令行使用技巧

    比如,通过把具有相同逻辑代码抽象成函数,从而能够加以反复调用。...(重点) 描述:我们即将执行命令与之前命令具有相同参数,比如同样文件名、路径名等等,此时我们可以采用下面的方法进行重复利用上次执行参数值; 基础示例: 1.引用最后一位参数 #方式1.最常用是...h 向左移动一个字符 l 往右移动一个字符 b 向左移动一个单词 w 往右移动一个单词 e 移到单词结尾 B、W、E 与 b、w、e 类似,按不同单词定义进行移动 0 移到首 ˆ 移到首,但第一个字符为非空白字符...x 删除光标下字符 X 删除光标左边字符 dm m 为某个移动指令,如 db 删除光标左边单词 ,dl则是删除光标右边单词(值得学习) D 光标处删除到行尾 dd 删除整行内容 注意:通过删除命令删除内容...off # 如果设置,且readline正被使用,正在完成一个包含@bash将试图执行主机名补全 huponexit off interactive_comments on #在一个交互式

    6K20

    Bash 手册 v3.2 - 3

    一个简单命令就是一串以控制操作符结尾并用空白符 (*参见 2 定义::)分隔单词. 通常第一个单词指定了要执行命令, 剩余单词 都是该命令变元.    ...在这些列表操作符, '&&'和'||'具有相同优先级, ';'和'&'具有相同优先 级, 且'&&'和'||'优先级比';'和'&'要高.    ...然后显示出'PS3'并且     等待标准输入有一输入. 如果输入是上面项目序列某个项目前面的     数字, 则NAME被设置成此项目....这里有一个例子, 它用户当前目录中选择一个文件名, 然后显示出该文件     名称及序号:         select fname in *;         do             echo...模式任何部分也可以通过加以引用, 以强制使其作为字符串进行匹配.     另外, 还有一个二元操作符'=~'. 它和'=='及'!='具有相同优先级.

    1.5K10

    Bash 编程易错总结大全

    所以两者含义是完全不一样。 13. cat file | sed s/foo/bar/ > file 你不应该在一个管道,从一个文件同时,再往相同文件里面写,这样后果是未知。...当你写下 foo = bar ,shell 会将该命令解析成三个单词,然后第一个单词 foo 会被认为是一个命令,后面的内容会被当作命令参数。...shell 进程,子 shell 进程 cd 命令仅会影响当前 shell 环境变量,所以父进程环境命令不会被改变;执行到下一次循环,无论之前 cd 命令有没有执行成功,我们会回到相同的当前目录...所以软链接损坏,即实际指向文件删除后,-e 结果返回 1。...并且相同情况下,内置功能肯定比外部命令效率要高。 上面的例子,目的是为了删除单词首字符,可以这样做: $ word=match $ echo "${word#?}"

    2.9K10

    Linux学习笔记(四)

    shell会按照下列顺序,运行第一个被找到问题件,找到之后则忽略后面的 ~/.bash_profile ~/.bash_login ~/.profile 注意:这个列表没有~/.bashrc文件,...关于用户默认登录shell是在 /etc/passwd 文件记录。此文件每一就是一个用户,每行以冒号分割字段,其中最后一个字段表示是用户默认登录使用shell。...MAIL 当前用户收件箱文件名(bash shell会检查这个文件,看看有没有邮件) MAILPATH 冒号分隔的当前用户收件箱文件名列表(bash shell会检查列表每个文件,看看有没有新邮件...COMP_TYPE 一个整数值,表示所尝试补全类型,用以完成shell函数补全 COMP_WORDBREAKS Readline库中用于单词补全词分隔字符 COMP_WORDS 含有当前命令行所有单词数组变量...函数名称 续 变量 描述 FUNCNEST 设置成非零值,表示所允许最大函数嵌套级数(一旦超出,当前命令即被终止) GLOBIGNORE 冒号分隔模式列表,定义了在进行文件名扩展可以忽略一组文件

    1.1K10

    shell 教程,这次要步步详解,学会了以后能早点下班

    shell ,每一个变量值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串形式存储。...前面我们还留下一个疑问,定义变量,变量可以由单引号’ '包围,也可以由双引号" "包围,它们到底有什么区别呢?...例如,在 demo 目录创建了一个名为 log.txt 文本文件,用来记录日常工作。...有读者可能会问,如果一个变量在所有 Shell 进程中都有效,不管它们之间是否存在父子关系,该怎么办呢? 只有将变量写入 Shell 配置文件才能达到这个目的!.../parameter.sh a b c 5.全局变量与局部变量 默认条件下,在函数和shell主体建立变量都是全局变量,可以相互引用,shell主体部分与函数部分拥有名字相同变量,可能会相互影响

    4.2K20

    BashShell变量

    局部环境变量:局部环境变量只对创建它们 Shell 和子 Shell 可见。 本地环境变量:本地环境变量只能在定义它们函数内部以及子函数可见。...除了输出所有的环境变量外,使用不带参数 set 命令还会输出当前环境所有的函数。 2.4 本地环境变量 本地环境变量只能在函数内部被定义和使用,它们只能在定义它们函数内部以及子函数可见。 3....会检查列表每个文件,看看有没有新邮件) OPTARG getopts 命令处理最后一个选项参数值 OPTIND getopts 命令处理最后一个选项参数索引号 PATH Shell 查找命令目录列表...控制哪些命令留在历史记录列表 HISTFILE 保存 Shell 历史记录列表文件名(默认是 .bash_history) HISTFILESIZE 最多在历史文件存多少 HISTTIMEFORMAT... * 用双引号括起,即 " 6.4 $@ @ 未用双引号括起,即 @:等同于 @ 用双引号括起,即 " 【注】* 和 @ 使用很容易混淆,为了更好地理解可以参见以下例子: 首先定义脚本文件

    2.4K30

    Bash$$ $! $# $0 $? $* $@ 等各种符号含义

    问: 在 Bash ,似乎有几个变量持有特殊具有一致含义值。 例如: ./myprogram &; echo $! 将返回 myprogram 后台进程 PID。还知道其他,比如 $?...$* 扩展为位置1开始位置参数。扩展不在双引号内,每个位置参数扩展为一个单独单词。在执行该操作上下文中,这些单词会被进一步地单词拆分和文件名扩展。...当在双引号展开,它将扩展为单个单词,每个参数值由特殊变量 IFS 第一个字符分隔。也就是说,$* 等价于$1c$2c... ,其中 c 是 IFS 变量值第一个字符。...如果 IFS 为 null,则连接参数不插入分隔符。 $@ 扩展为位置1开始位置参数。作用跟 $* 类似,只是不受 IFS 变量值影响。.../manual/bash.html#Variable-Index 相关阅读: 如何通过一个Bash定界符来分割一个字符串 向Bash函数传递参数 如何用Bash遍历文本文件每一 Bash单引号和双引号区别

    75340

    一顿操作猛如虎,涨跌全看特朗普!

    split()返回一个列表,我们称之为tweet_words。我们可以使用len函数计算列表项数。在第4和第5,我们打印前面步骤结果。注意第5str函数。...这段代码一个改进是它结构更好:我们尝试将代码不同逻辑部分分离到不同函数函数是用def关键字定义,后跟着一个函数名,后面跟着圆括号零个或多个参数。...步骤四 我们代码仍然存在一些明显缺陷。例如,我们可以假设一个名词,无论是单数还是复数,都具有相同值。...此外,如果我们可以将所有模块安装在代码所在同一目录,则只需复制该目录并在不同机器上运行。 因此,我们创建一个虚拟环境开始。 首先,确保与代码所在文件相同。...由于这些(以及更多)原因,我们需要将数据代码中分离出来。换句话说,我们需要将字典保存在单独文件,然后将其加载到程序文件有不同格式,这说明数据是如何存储在文件

    4K40

    这是谁做作业!C语言编码太不规范了...

    变量命名 变量命名基本原则是使得变量含义能够名字中直接理解。可以用多个英文单词拼写而成,每个英文单词首字母要大写,其中英文单词有缩写可用缩写。...方法名称如果包含多个单词,除了第一个单词外,每个单词首字母大写,其它字母小写。如果这些单词是缩略语(例如XML),也要首字母大写,其它字母小写(写作Xml)。...注释约定 在软件对每个文件头,自定义函数和变量,重要处理过程都要有必要注释。...代码通常使用几个函数和过程来实现某一项功能,这时候需要使用区注释将这些具有共同目的函数和过程标明出来。 使用整行”*”作为隔离程序清晰可读。...Ø 动态全局空间在程序结束一定要释放。 Ø 所有动态分配空间在对应层次模块释放,并且用完马上释放。不重复释放相同指针。 函数/过程定义 在函数定义处应当增加本函数功能描述注释。

    1.3K20
    领券