Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 需要awk脚本或任何其他方法在unix上执行此操作_Bash_Shell_Unix_Scripting_Awk - Fatal编程技术网

Bash 需要awk脚本或任何其他方法在unix上执行此操作

Bash 需要awk脚本或任何其他方法在unix上执行此操作,bash,shell,unix,scripting,awk,Bash,Shell,Unix,Scripting,Awk,我有一个小文件,大约有50行和2个字段,如下所示 file1 ----- 12345 8373 65236 7376 82738 2872 .. .. .. 我有大约100个文件,它们是逗号,“,如下所示: file2 ----- 1,3,4,4,12345,,,23,3,,,2,8373,1,1 每个文件都有许多类似于上一行的行。 我想从这100个文件中提取 第五个字段与第一个文件中的第一个字段相同,并且 第13个字段等于第一个文件中的第2个字段 我想用这个文件搜索所有100个

我有一个小文件,大约有50行和2个字段,如下所示

file1
-----
12345   8373
65236   7376
82738   2872
..
..
..
我有大约100个文件,它们是逗号
,“
,如下所示:

file2
-----
1,3,4,4,12345,,,23,3,,,2,8373,1,1
每个文件都有许多类似于上一行的行。 我想从这100个文件中提取 第五个字段与第一个文件中的第一个字段相同,并且 第13个字段等于第一个文件中的第2个字段

我想用这个文件搜索所有100个文件

对于一个逗号分隔的文件,我提出了以下建议。我甚至不确定这是否正确! 但我有多个逗号分隔的文件

awk -F"\t|," 'FNR==NR{a[$1$2]++;next}($5$13 in a)' file1 file2
有人能帮我吗

编辑:
对于单个文件,上述命令可以正常工作。

这里是一个简单的方法。从小文件中提取每一行,将其拆分为字段,然后使用awk打印与这些字段匹配的其他文件中的行:

while read line
do
   f1=$(echo $line | awk '{print $1}')
   f2=$(echo $line | awk '{print $2}')
   awk -v f1="$f1" -v f2="$f2" -F, '$5==f1 && $13==f2' file*
done < small_file
读取行时
做
f1=$(echo$行| awk'{print$1}')
f2=$(echo$行| awk'{print$2}')
awk-v f1=“$f1”-v f2=“$f2”-F,$5==f1&&$13==f2”文件*
完成<小文件

这里有一个简单的方法。从小文件中提取每一行,将其拆分为字段,然后使用awk打印与这些字段匹配的其他文件中的行:

while read line
do
   f1=$(echo $line | awk '{print $1}')
   f2=$(echo $line | awk '{print $2}')
   awk -v f1="$f1" -v f2="$f2" -F, '$5==f1 && $13==f2' file*
done < small_file
读取行时
做
f1=$(echo$行| awk'{print$1}')
f2=$(echo$行| awk'{print$2}')
awk-v f1=“$f1”-v f2=“$f2”-F,$5==f1&&$13==f2”文件*
完成<小文件

下面是另一个使用数组,避免多个工作文件的示例:

#!/bin/awk -f

FILENAME == "file1" {
    keys[$1] = ""
    keys[$2] = ""
    next
}

{
    split($0, fields, "," )
    if (fields[5] in keys && fields[13] in keys) print "*:",$0
}
我使用split是因为两个文件中的字段分隔符不同。如果需要的话,你可以交换一下。您应该这样调用脚本:

runit.awk file1 file2

另一种方法是显式打开第一个文件(使用“打开”)并在BEGIN块中读取它(readline)

下面是另一个使用数组,避免多个工作文件的示例:

#!/bin/awk -f

FILENAME == "file1" {
    keys[$1] = ""
    keys[$2] = ""
    next
}

{
    split($0, fields, "," )
    if (fields[5] in keys && fields[13] in keys) print "*:",$0
}
我使用split是因为两个文件中的字段分隔符不同。如果需要的话,你可以交换一下。您应该这样调用脚本:

runit.awk file1 file2

另一种方法是显式打开第一个文件(使用“打开”)并在BEGIN块中读取它(readline)

你说,“我甚至不确定这是否正确!”如果这里有人给你一个不同的脚本,你怎么知道它是否正确?字段1和5必须匹配,字段2和13必须匹配,行号也必须匹配?换句话说,如果字段匹配,但它们仅在第一个文件的第1行和第二个文件的第42行匹配,那么这些行实际上并不匹配。是吗?行可能不匹配。顺便说一句,我测试了我的命令,它在单个文件中工作正常。它在多个文件中工作吗?如果没有,怎么了?你收到错误消息了吗?你说,“我甚至不确定这是否正确!”如果这里有人给你一个不同的脚本,你怎么知道它是否正确?字段1和5必须匹配,字段2和13必须匹配,行号也必须匹配?换句话说,如果字段匹配,但它们仅在第一个文件的第1行和第二个文件的第42行匹配,那么这些行实际上并不匹配。是吗?行可能不匹配。顺便说一句,我测试了我的命令,它在单个文件中工作正常。它在多个文件中工作吗?如果没有,怎么了?您是否收到错误消息?