shell:选择平面文件的唯一行

2024-01-11

我有一个像这样的平面文件

cat file

ID1, VALUE1_1
ID1, VALUE1_2
ID1, VALUE1_3
ID2, VALUE2_1
ID2, VALUE2_1
ID3, VALUE3_1
ID3...

正如您从数据样本中看到的,对于每个 ID,该 ID 有多个值,它们可以是任何值 - 相同或不同。对我来说,我不在乎它会获得哪个值。任何价值都适合我。

所以我只想要每个 ID 的一个值。我真的不在乎哪一行,但如果我必须选择,我会说长度最长的行。

ID1, VALUE1_2
ID2, VALUE2_1
ID3, VALUE3_1

它可能是用Python完成的,但有没有一种简单的方法可以在Shell本身中做到这一点,我愿意使用sed或awk,但请不要写一整段awk代码,拜托。

它可能看起来像:

# Pseudo code
# sort -k 1 file | uniq (max(length) by id)  

多谢 !!


EDIT:

Hey 用户84771 https://stackoverflow.com/users/1953475/user84771,

所以我根据你所说的完全修改了我的答案。它还有几行,但希望这就是您正在寻找的内容:

为了从类似于 Mysql 中的 group by 的“每个 ID”中找到最大的行,我将执行以下操作。

给定以下文本文件:

[root@dev7 ~]# cat stackoverflow2.log 
ID1, fdsgfdsggfdsgsdfg
ID1, fdsgsdfg
ID1, fdsgfdgdsfgdsgsdfgdgffdsgfsdg
ID1, fdsgsdfg
ID2, fdgsfdsgfdshshdsfhdfghdsfhdfhdshsdfhsfdh
ID2, fsfgsdgf
ID3, fdgfdgdgfdggfdg
[root@dev7 ~]# 

我会做以下事情:

_DATAFILE=stackoverflow2.log
_KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq | sed "s,\,,,g" | xargs )
_LARGEST_PER_KEY=""
echo $_KEYS
for i in ${_KEYS}; do
  _LARGEST_PER_KEY="${_LARGEST_PER_KEY}\n$(grep "$i" ${_DATAFILE} | uniq | awk '{ print length ":", $0 }' | sort -n -u | tail -1 | cut -d ":" -f2 | awk '{ $1=$1; print}')"
done;
echo -e ${_LARGEST_PER_KEY}

解释发生了什么。

  • _数据文件- 该变量是您的输入文件。
  • _KEYS- 此变量返回第一列中的所有键(唯一且已排序(带/不带关联数据))。我使用 xargs 来制作 确保所有按键都排成一条直线以进行下一步。

[root@dev7 ~]# _KEYS=$(awk '{ $1=$1; print $1}' ${_DATAFILE} | uniq | sed "s,\,g" | sed xargs )

[root@dev7 ~]# echo $_KEYS

ID1 ID2 ID3

  • _LARGEST_PER_KEY- 当我们完成后,该变量将用于您的结果。我们在 for 循环之前定义它。

  • for 循环对 quest 中的键(例如 ID1 )执行 grep,然后执行我的表单代码行以找出哪一个包含最长的数据值,并执行数字/uniq 排序以查看哪一个是最大的。我们使用 tail 获取该值并将其附加到我们的 _LARGEST_PER_KEY 字符串中。 (注意:我们添加 \n 字符作为分隔符)

  • 一旦 for 循环完成,我们就使用 echo -e 回显结果,以确保换行符在屏幕上得到正确的评估:

[root@dev7 ~]# echo -e ${_LARGEST_PER_KEY}

ID1,fdsgfdgdsfgdsgsdfgdgffdsgfsdg

ID2,fdgsfdsgfdshshdsfhdfghdsfhdfhdshsdfhsfdh

ID3、fdgfdgdgfdggfdg

注意:由于我们一开始就对所有内容进行了排序,因此没有理由再次排序。

澄清说明:

awk '{ $1=$1;打印}'- 这会删除尾随空格(行首/行尾)

uniq- 摆脱重复项

awk '{ 打印长度 ":", $0 }'- 获取每行的行长,用“length of line”打印出来:“line test”

排序 -n -u- 数字排序(最大数字是最后一项)。还确保整个文件的排序是唯一的,如果数据文件 到达时未分类。谢谢你的提示Glenn https://stackoverflow.com/users/7552/glenn-jackman.

tail -1- Grab 是自最大以来的最后一条线路

剪切-d“:”-f2- 如果您只想要精确的线条,请去掉线条的长度,只需返回线条即可

awk '{ $1=$1;打印}'- 这会删除尾随空格(行首/行尾)

再说一次,我确信有一种方法可以更有效地做到这一点,但这就是我能够想出的。希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell:选择平面文件的唯一行 的相关文章

  • 如何从 LaTeX 执行 shell 脚本?

    我正在尝试在 LaTeX 中执行以下操作 documentclass article begin document execute usr local bin my shell script sh end document 想法是执行 us
  • 使用 dc.js 按条形值对条形图中的条形进行排序(排序)

    如何通过维度的计算值而不是维度本身的名称对 dc js 示例中的 x 轴 维度 进行排序 例如 请考虑序数条形图的 dc js 示例 https github com dc js dc js blob master web examples
  • 在 bash 脚本中使用源时出现“源:未找到”错误

    我正在尝试编写 我认为的 一个简单的 bash 脚本 它将 运行 virtualenv 以 1 美元创建一个新环境 激活虚拟环境 做更多的事情 安装 django 将 django admin py 添加到 virtualenv 的路径等
  • Bash while 循环等待任务完成

    我创建了一个 bash 脚本来处理文件夹及其子文件夹中的视频 find type f name mkv while read file do ffmpeg i file done 问题 它不是 while 循环等待 ffmpeg 完成 而是
  • 如何使用bash脚本获取分区的偏移量?

    我可以用parted找出我的图像的偏移量 sudo parted s image img unit B print Model file Disk home user image img 107374182400B Sector size
  • 在 Java 中对多语言环境字符串进行排序

    我正在尝试按字符串字段 国家 地区 对对象列表进行排序 每个国家 地区都使用其母语 阿根廷 澳大利亚 奥地利 例如 我想要做的是让 出现在 A 国家之后 因为字母 对应于拉丁语 B 我正在尝试使用默认的 Collat er 但非拉丁名称仍然
  • 如何用awk删除以“C”开头的行?

    如何使用以下命令从文本文件中删除以 C 开头的行awk 有什么建议请 如果数据在文件中data txt then With awk awk C data txt With grep grep v C data txt 显示开头不带 C 的所
  • Python DNS服务器IP地址查询

    我正在尝试使用 python 获取 DNS 服务器 IP 地址 要在 Windows 命令提示符下执行此操作 我将使用 ipconfig 全部 如下所示 我想使用 python 脚本做同样的事情 有什么方法可以提取这些值吗 我成功提取了设备
  • 为什么这个符号链接创建了两个实例

    我有一个用于我的点文件的安装脚本 我用来创建一个目录到我的主文件夹的符号链接 这些链接执行得很好 但创建了第二个符号链接 我无法解释为什么 项目中的文件夹结构如下所示 install sh scripts shell sh shell in
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 如何设置 tmux 在启动时打开指定的窗口?

    如何设置 tmux 使其在启动时打开指定的窗口 您可以编写一个小 shell 脚本来启动 tmux 以及所需的程序 我在一个名为 dev tmux 的 shell 脚本中包含以下内容 开发环境 bin sh tmux new session
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 如何在 JavaScript 中对关联数组进行排序?

    我需要为我的一个项目通过 JS 对关联数组进行排序 我发现这个函数在 Firefox 中运行得很好 但不幸的是它在 IE8 OPERA CHROME 中不起作用 无法找到使其在其他浏览器中运行的方法 或者找到另一个适合该目的的函数 我真的很
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • Jenkins:如何在 Windows 从机中执行 shell 脚本

    我有一个 Windows 从机 安装了 bash 我正在尝试在其上运行 shell 脚本作为预构建步骤 关于我如何做到这一点有什么想法吗 您需要使用脚本作为参数来运行 bash bash yourscript
  • 如何使用自定义比较器以不同的词汇顺序对数组进行排序?

    所以 我对 C 还很陌生 我正在尝试使用自定义比较器来订购数组 我创建了一个类 class MySorter IComparer public int Compare object x object y var chars jngmclqs
  • 在 macOS 上使用 find 时出现“非法选项”错误

    我试图列出末尾仅带有字母 R 的文件 我用了find在 macOS 终端中如下所示 find type f name R 但我收到消息说illegal option t 第一个参数find是它应该开始寻找的路径 路径 表示当前目录 find
  • Bash 中单行 while 循环的语法

    我无法找到分号和 或大括号的正确组合 我想这样做 但作为命令行中的一句 while 1 do foo sleep 2 done while true do foo sleep 2 done 顺便说一句 如果您在命令提示符下将其输入为多行 如

随机推荐