Tag: awk

从Bash中另一个更大的文本文件中find文本文件的行的最快方法

我有两个文件, file1.txt和file2.txt 。 file1.txt约有14K行, file2.txt约有20亿。 file1.txt每行有一个字段f1 ,而file2.txt有3个字段,从f1到f3 ,由| 。 我想从file2.txt中find所有行,其中file1.txt f2与file2.txt f2匹配(或者如果我们不想花费额外的时间分割file2.txt的值,则file2.txt )。 file1.txt(约14K行, 未sorting ): foo1 foo2 … bar1 bar2 … file2.txt(约20亿行, 未sorting ): date1|foo1|number1 date2|foo2|number2 date3|foo3|number3 … date1|bar1|number1 date2|bar2|number2 date3|bar3|number3 预期产出: date1|foo1|number1 date2|foo2|number2 date1|bar1|number1 date2|bar2|number2 … 这是我已经尝试过,似乎需要几个小时才能运行: fgrep -F -f file1.txt file2.txt > file.matched 我想知道是否有一个更好,更快的方式来执行这个操作与普通的Unix命令或一个小脚本。

解释awk命令

今天我正在寻找一个命令在网上打印下两行后,我遇到了一个awk命令,我无法理解。 $ /usr/xpg4/bin/awk '_&&_–;/PATTERN/{_=2}' input 有人可以解释吗?

从CSV中删除非ASCII字符

我想从文件中删除所有非ASCII字符。 我发现tr的一个解决scheme,但我想我需要写回修改后的文件。 我需要在相对较好的performance上做到这一点。 有什么build议么?

用awk或sed删除一列

我有一个三列的文件。 我想删除第三列(就地编辑)。 我如何用awk或sed来做到这一点? 123 abc 22.3 453 abg 56.7 1236 hjg 2.3 期望的输出 123 abc 453 abg 1236 hjg

使用AWK处理来自多个文件的input

许多人通过发布以下解决scheme来一次AWK多个input文件非常有帮助: $ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 这很好,但我想知道如果有人能向我解释为什么? 我发现AWK语法有点难以理解,希望有人不介意打破我的代码片断。 感谢您的时间和帮助!

什么是awk中的“NR == FNR”?

我正在学习使用awk文件比较。 我发现像下面的语法, awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2 我不明白NR==FNR在这个意义上是什么意思? 如果我尝试使用FNR==NR那么我也得到相同的输出? 究竟是什么?

awk:从行模式访问捕获的组

如果我有一个awk命令 pattern { … } 和模式使用一个捕获组,我怎样才能访问在块中捕获的string?

awk中的/ start /,/ end / rangeexpression式有用吗?

我一直主张,你不应该使用如下的范围expression式: /start/,/end/ 在awk中,因为虽然它使得你只想打印匹配的文本,包括开始和结束行稍微比替代*更简单的情况: /start/{f=1} f{print; if (/end/) f=0} 当你想稍微修改它来做任何事情时,它需要完整的重写或者导致重复的代码或其他不合需要的代码。 例如,如果要使用上面的第二种forms打印除范围分隔符之外的匹配文本,则只需调整它即可移动组件: f{if (/end/) f=0; else print} /start/{f=1} 但是如果你开始使用/start/,/end/你需要放弃这个方法来支持我刚刚发布的内容,或者你必须写下如下内容: /start/,/end/{ if (!/start|end/) print } 即重复不合要求的条件。 然后我看到一个发布的问题,需要在文件中标识最后的end ,并且在解决scheme中使用了范围expression式,我认为这似乎可能有一些价值(请参阅https://stackoverflow.com/a/21145009/ 1745001 )。 但是现在,我又回想到,根本不值得使用范围expression式,而不使用范围expression式的解决scheme在这种情况下也能起作用。 所以 – 有没有人有范例expression式实际上增加一个解决scheme明显的价值? *我曾经使用: /start/{f=1} f; /end/{f=0} 但是太多的时候,我发现我不得不另外做一些额外的事情,当f是真的和/end/被发现(或换一种方式,只有做一些事情/end/被发现如果f是真的),所以现在我只是试图坚持稍微简短一点,但更健壮和可扩展: /start/{f=1} f{print; if (/end/) f=0}

在bash中转换date格式

我有一个这样的格式的date:“2011年6月27日”,我想将其转换为20110627 是否有可能在bash中做?

是否有一个Unix工具预加时间戳到标准input?

我最终在Python中为此写了一个快速的小脚本,但是我想知道是否有一个实用程序可以给文本添加文本,在文本中添加一些文本 – 在我的具体情况下是时间戳。 理想情况下,使用会是这样的: cat somefile.txt | prepend-timestamp (在你回答sed之前,我试过这个: cat somefile.txt | sed "s/^/`date`/" 但是,执行sed时只会计算一次date命令,所以相同的时间戳被错误地添加到每行。