Bash 需要awk脚本或任何其他方法在unix上执行此操作
我有一个小文件,大约有50行和2个字段,如下所示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个
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行匹配,那么这些行实际上并不匹配。是吗?行可能不匹配。顺便说一句,我测试了我的命令,它在单个文件中工作正常。它在多个文件中工作吗?如果没有,怎么了?您是否收到错误消息?