bash - Awk:停止 'print' 添加换行符以及如何循环/自动化

标签 bash awk

就目前而言,我的制表符分隔数据布局如下(为清楚起见,在此处添加标题):

EntryID    GroupID    Result
039848     00100      Description 1  
088345     00200      Description 2
748572     00435      Description 3
884938     00200      Description 2
000392     00200      Description 3
008429     00100      Description 4

我想做的是将我的数据压缩成组。我希望输出一个表,其中 A 列是 groupID(没有重复),B 列是与该组关联的所有描述的组合。示例输出为:

00100      Description 1 | Description 4
00200      Description 2 | Description 2| Description 3
00435      Description 3

我尝试编写一个 awk 命令来一次生成一行,给定组 ID 作为参数:

$ awk -F '\t' '/00100/ { print $2 '\t' $3 }' table.txt > output.txt

这是可行的,但是每次命中都打印在换行符上,就像这样

00100    Description 1
00100    Description 2

etc

我认为这可以通过将 ORS 指定为替代字符或使用 printf 而不是 print 来解决,但是当我尝试其中任何一个时

$ awk -F '\t' 'BEGIN {ORS = '\t'} /00100/ { print $2 '\t' $3 }' table.txt > output.txt
or
$ awk -F '\t' '/00100/ { printf $2 '\t' $3 }' table.txt > output.txt

输出实际上没有任何变化。

一旦我解决了这个问题,我遇到的另一个问题是我有成千上万的小组要重复这个问题。我有数据中存在的每个组 ID 的列表,存储在不同的文件中,我想为每个 ID 自动将其提供给 awk。

我已经尝试修改一个我见过的命令,该命令用于以类似的方式将 ID 提供给 grep,但我也没有任何运气,因为它只是挂起:

$ for i in `$ cat groupIDs.txt`; do awk -F '\t' '/$i/ { print $2 '\t' $3 }' table.txt' >> test_results.txt ; done;

有什么办法可以解决这些问题吗?

最佳答案

我不太了解 awk,但您可以使用 bash、sort、grep、剪切和粘贴来完成此操作:

#!/bin/bash

groups=$(cut -f2 "$1" | sort -u)
for group in $groups ; do
    echo -n "$group "
    cut -f2- "$1" | grep "^$group" | cut -f2 | paste -d"|" -s -
done

这会产生以下输出:

00100   Description 1|Description 4
00200   Description 2|Description 2|Description 3
00435   Description 3

不确定输出分隔符必须"| " 还是"|" 可以。

关于bash - Awk:停止 'print' 添加换行符以及如何循环/自动化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879909/

相关文章:

python - 需要帮助来解析文件

php - Shell:SVN 状态管道到 php 以检查语法

python - grep 特定时间范围内的日志文件

linux - 获取所有WiFi的SSID和BSSID

linux - 如何替换括号之间的换行符

linux - awk 子串单个字符

bash - 在 Bash 脚本中随机选择并打印三个字符串之一

linux - 算术语法错误

linux - 过滤文件名中嵌入时间戳的文件

linux - 删除列表中早于文件纪元日期的文件