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递增,直到它们被删除