Awk打印数组的单个元素
这应该非常容易。我只想打印数组的单个元素。但是,像Awk打印数组的单个元素,awk,Awk,这应该非常容易。我只想打印数组的单个元素。但是,像print arr[1]这样的命令只能得到一个空行 以下是我的整个bash脚本: #!/bin/bash find -X $1 -type f | xargs md5 | awk ' NF == 4 { md5[$4]++; files[$2]++; } END { for (i = 1; i <= NF; i++) for (j = i + 1; j <= NF; j++)
print arr[1]
这样的命令只能得到一个空行
以下是我的整个bash脚本:
#!/bin/bash
find -X $1 -type f |
xargs md5 |
awk '
NF == 4 {
md5[$4]++;
files[$2]++;
}
END {
for (i = 1; i <= NF; i++)
for (j = i + 1; j <= NF; j++)
if (md5[i] == md5[j]) {
print "These are duplicates: "
print files[j+1]
print files[i]
}
'
exit 0
#/bin/bash
查找-X$1-类型f|
xargs md5|
awk'
NF==4{
md5[$4]++;
文件[$2]++;
}
结束{
对于(i=1;i您当前所做的是指定要另存为两个数组的索引的值,这在awk
中的代码示例中似乎很常见。但是,这通常与for(x in y)结合使用
语法。要修复代码,我想到的修复方法是修改awk
如下:
BEGIN {
md5idx = 0;
filesidx = 0;
}
然后改变:
NF == 4 {
md5[md5idx++] = $4;
files[filesidx++] = $2;
}
我想这应该可以做到,但我还没有测试它。您目前正在做的是指定要保存为两个数组的索引的值,这在awk
中的代码示例中似乎很常见。但是,这通常与for(x in y)结合使用
语法。要修复代码,我想到的修复方法是修改awk
如下:
BEGIN {
md5idx = 0;
filesidx = 0;
}
然后改变:
NF == 4 {
md5[md5idx++] = $4;
files[filesidx++] = $2;
}
我想这应该可以做到,但我还没有测试它。我花了一段时间才找到一个标准的md5
,而不是我自己的自制版本,但是MacOS X 10.7.2上的版本的示例输出是:
$ /sbin/md5 $(which -a md5)
MD5 (./md5) = 57f49e1c53ca7875fe63a33958ab0b0b
MD5 (/Users/jleffler/bin/md5) = 57f49e1c53ca7875fe63a33958ab0b0b
MD5 (/sbin/md5) = dd00b1dc4dd11c8443a70b5d33e0cade
$
假设md5
的输出在第4列是一个哈希,在第2列是一个文件名,名称周围用括号括起来不重要,并且还假设名称不包含任何空格(因为文件名中的空格会弄乱列的编号),那么您可能需要这样的结果:
#!/bin/bash
find -X "${@:-'.'}" -type f |
xargs /sbin/md5 |
awk '
NF == 4 {
if (file[$4] != "") printf "Duplicate: MD5 %s - %s & %s\n", $4, file[$4], $2;
else file[$4] = $2;
}'
exit 0
示例输出:
Duplicate: MD5 57f49e1c53ca7875fe63a33958ab0b0b - (./md5) & (/Users/jleffler/bin/md5)
这将在运行时标识重复的MD5值。如果(关联)中没有条目数组file
对于给定的MD5散列,则使用文件名创建一个条目。如果有条目,则打印MD5值和两个文件名;您可以讨论格式,这可能比挤在一行上更好
“${@:-”.}
符号表示“如果有命令行参数,请使用;否则,请使用
(当前目录)”。这似乎比使用第一个参数(仅限)更有用如果没有提供参数,则会失败。我花了一段时间才找到一个标准的md5
,而不是我自己的自制版本,但是MacOS X 10.7.2版本的示例输出是:
$ /sbin/md5 $(which -a md5)
MD5 (./md5) = 57f49e1c53ca7875fe63a33958ab0b0b
MD5 (/Users/jleffler/bin/md5) = 57f49e1c53ca7875fe63a33958ab0b0b
MD5 (/sbin/md5) = dd00b1dc4dd11c8443a70b5d33e0cade
$
假设md5
的输出在第4列是一个哈希,在第2列是一个文件名,名称周围用括号括起来不重要,并且还假设名称不包含任何空格(因为文件名中的空格会弄乱列的编号),那么您可能需要这样的结果:
#!/bin/bash
find -X "${@:-'.'}" -type f |
xargs /sbin/md5 |
awk '
NF == 4 {
if (file[$4] != "") printf "Duplicate: MD5 %s - %s & %s\n", $4, file[$4], $2;
else file[$4] = $2;
}'
exit 0
示例输出:
Duplicate: MD5 57f49e1c53ca7875fe63a33958ab0b0b - (./md5) & (/Users/jleffler/bin/md5)
这将在运行时标识重复的MD5值。如果(关联)中没有条目数组file
对于给定的MD5散列,则使用文件名创建一个条目。如果有条目,则打印MD5值和两个文件名;您可以讨论格式,这可能比挤在一行上更好
“${@:-”.}
符号表示“如果有命令行参数,请使用;否则,请使用
(当前目录)”。这似乎比使用第一个参数(仅限)更有用如果没有提供参数,则失败。您也可以使用包含行号的NR
作为索引,将字段值存储到数组中,而不是使用变量
NF == 4 {
md5[NR]=$4;
files[NR]=$2;
}
然后在END
部分中,您可以使用类似于for(i=1;i的变量,也可以使用包含行号的NR
作为索引,将字段值存储到数组中
NF == 4 {
md5[NR]=$4;
files[NR]=$2;
}
然后在结尾部分中,您可以使用类似的(i=1;i你确定你的数组是数字索引的吗?我想这就是所有awk数组的工作方式。如果它们没有数字索引,我如何引用单个元素?你可以看到我上面的全部代码,所以你可以看出我没有对数组元素做任何特殊的索引。如果这不是自动发生的,那么我需要int不知何故,你似乎在为数组分配字段$4
和$2
作为索引。这些是什么?手头没有shell。:)哦,我明白你的意思了。你所做的是将值指定为索引,这在awk
中似乎是一种实践。你可以在BEGIN
中创建两个变量(每个数组一个),然后递增这些变量,然后像md5[index++]=$4
,例如。你确定你的数组是数字索引的吗?我想这就是所有awk数组的工作方式。如果它们没有数字索引,我如何引用单个元素?你可以看到我上面的整个代码,这样你就可以知道我没有对数组元素进行任何特殊的索引。如果这不是自动发生的,那么n我需要以某种方式介绍一下。您似乎在为数组分配字段$4
和$2
作为索引。这些是什么?手头没有shell。:)哦,我明白你的意思了。你所做的是将值指定为索引,这在awk
中似乎是一种实践。你可以在BEGIN
中创建两个变量(每个数组一个),然后递增这些变量,然后像md5[index++]=$4,例如。我犯了另一个非常愚蠢但无关的错误:我应该让I和j递增,直到它们被删除。我犯了另一个非常愚蠢但无关的错误:我应该让I和j递增,直到它们被删除