bash - 在文件的行中搜索特定字段

标签 bash shell

我有一个包含如下数据的文件:

0000380000000101
0000650000000201
0000650000000301
0000650000000401
0001000000000101
0001000000000201

....等等。我想处理这些数据,以便得到类似的输出

000065 0000000201 0000000301 0000000401  
000100 0000000101 0000000201

由于 000065 重复了三次,在输出中我希望 000065 只出现一次,而应该打印出现 000065 的每个条目中的相应字节。因为 000038 只出现过一次,所以我不想在输出中出现这个。在此示例中,数据(即 000065 或 000038 恰好是 3 个字节,尽管它可以是任意长度,而在此之后的字节,如 0000000401 将是固定长度,即 5 个字节)。我想最好使用 shell 脚本或 c 来做到这一点。请让我知道我该怎么做。 awk 在这里有帮助吗? 任何帮助将不胜感激。以下是从实际文件中提取的数据,我要处理:

0000000000000101
0000000000000201
0000000000000301
0000000000000401
0000380000000101
0000650000000201
0000650000000301
0000650000000401
0001000000000101
0001000000000201
0001000000000301
0001000000000401
0038d30000000101
00652e0000000201
00652e0000000301
00652e0000000401
008d750000000101
008d750000000201
008d750000000301
008d750000000401
0100010000000101
0100010000000201
0100010000000301
0100010000000401
01008d0000000101
01008d0000000201
01008d0000000301
01008d0000000401
01a8c00000000101
01a8c00000000201
01a8c00000000301
01a8c00000000401
0264010000000101
0264010000000201
0264010000000301
0264010000000401
0615df0000000101
0615df0000000201
0615df0000000301
0615df0000000401
07dd940000000101
07dd940000000201
07dd940000000301
07dd940000000401
0900000000000101
0900000000000201
0900000000000301
0900000000000401
15dfc70000000101
15dfc70000000201
15dfc70000000301
15dfc70000000401
1ecf090000000101

最佳答案

你的数据是固定宽度的,所以你可以使用gawk:

$ gawk -v FIELDWIDTHS='6 10' 'NR!=1 && x==$1""{printf(" %s", $2); next}; {x=$1""; printf("%s%s %s", NR==1?"":"\n", $1, $2)}; END{print ""}' input.txt | sed '/^[0-9a-f]* [0-9a-f]*$/d'
000000 0000000101 0000000201 0000000301 0000000401
000065 0000000201 0000000301 0000000401
000100 0000000101 0000000201 0000000301 0000000401
00652e 0000000201 0000000301 0000000401
008d75 0000000101 0000000201 0000000301 0000000401
010001 0000000101 0000000201 0000000301 0000000401
01008d 0000000101 0000000201 0000000301 0000000401
01a8c0 0000000101 0000000201 0000000301 0000000401
026401 0000000101 0000000201 0000000301 0000000401
0615df 0000000101 0000000201 0000000301 0000000401
07dd94 0000000101 0000000201 0000000301 0000000401
090000 0000000101 0000000201 0000000301 0000000401
15dfc7 0000000101 0000000201 0000000301 0000000401

FIELDWIDTHS    A white-space separated list of fieldwidths.  When set, gawk parses the input into fields of fixed width, instead of using  the  value
               of the FS variable as the field separator.

关于bash - 在文件的行中搜索特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683921/

相关文章:

Bash 从列名中检索列号

c++ - 为什么 C-forkbombs 不像 bash 那样工作?

bash - 使用 AWK 递归查找

linux - 编写一个列出目录内容的脚本?

shell - 比较 shell 脚本中的变量

bash - 什么都不做的管道

python - Pyinstaller 无法与 Panda3D 一起使用 – 未找到 'direct' 模块

linux - 如何列出集群上给定帐户可用的所有程序?

bash - 如何查看/bin/sh 指向的内容

linux - 执行后获取执行的命令,带引号的params `"${argv[@] }"`