从基于密钥的文件中读取最近的条目

时间:2017-12-29 12:15:20

标签: bash shell awk cut

输入文件,fruits.txt:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

预期的输出文件:

JAN,APPLE 
FEB,MANGO 
JAN,ORANGE 
MAR,APPLE 
FEB,APPLE

要获得上述输出,请使用以下代码:

MAR,APPLE
FEB,APPLE
JAN,ORANGE

这适用于输入文件中的少量数据。我有20万个条目,并观察到切割命令非常慢。也试过awk,没有得到更好的结果。我的要求是从row1读取文件,键为column1。我需要为每个密钥更新条目。

3 个答案:

答案 0 :(得分:3)

我认为使用Awk可以非常轻松地完成此操作,只需使用$1分隔符分隔文件,您就需要在$2中散列,的值

awk -v FS=, -v OFS=, '{key[$1]=$2; next}END{for (i in key) print i,key[i]}' file

此外,如果您想在处理一百万行文件时加快速度,可以在解析时更改本地化设置以加快执行速度,您可以在本地将LC_ALL=C传递给命令。见Stéphane Chazelas's answer on what "LC_ALL=C" does?

答案 1 :(得分:3)

在bash版本4中,您可以声明一个关联数组,并使用::testing site with flash call winhttpjs.bat http://flash.org/video.php -saveto res.html find /i "http://www.adobe.com/go/getflashplayer" "res.html" >nul 2>nul && ( echo site has flash )||( echo site has NO flash ) ::testing site WITHOUT flash call winhttpjs.bat https://www.google.bg -saveto res.html find /i "http://www.adobe.com/go/getflashplayer" "res.html" >nul 2>nul && ( echo site has flash )||( echo site has NO flash ) 的结果填充它,并使用自定义read分割您的行:

IFS

如果要从数组生成特定输出,还需要循环:

$ declare -A a
$ while IFS=, read key value; do a["$key"]="$value"; done < fruits.txt
$ declare -p a
declare -A a=([MAR]="APPLE" [FEB]="APPLE" [JAN]="ORANGE" )

答案 2 :(得分:3)

最短的使用GNU datamash

datamash -st, -g1 last 2 <file
  • g1 - 第1栏分组
  • last 2 - 保留组的最后一个值

输出:

FEB,APPLE
JAN,ORANGE 
MAR,APPLE