我怎样才能使脚本在 k/v 对循环中更快地调用 awk?
How can I make a script that calls awk in a loop over k/v pairs faster?
我有大量的文本文件需要遍历。在循环时我想找到与字符串列表匹配的行并将每个字符串提取到一个单独的文件夹中。我有一个变量 "ij" 需要拆分为 "i" 和 "j" 以匹配两列。例如 2733 需要拆分为 27 和 33。脚本搜索每个文本文件并提取 i 和 j 为 2733 的每一行。
这里的问题是我有将近 100 个不同的字符串,因此需要大约 35 个小时才能完成所有这些字符串。
有没有办法在一个循环中将所有变量提取到单独的文件中?我试图遍历一个文本文件,提取我的字符串列表中的所有行并将它们输出到它们自己的文件夹,然后移至下一个文本文件。
我目前正在使用 "awk" 命令来完成此操作。
list="2741 2740 2739 2738 2737 2641 2640 2639 2638 2541 2540 2539 2538 2441 2440 2439 2438 2341 2340 2339 2241 2240 2141"
for string in $list
do
for i in ${string:0:2}
do
for j in ${string:2:2}
do
awk -v i=$i -v j=$j '==j && ==i {print [=11=]}' $datadir/*.txt >"${fileout}${i}_${j}_Output.txt"
done
done
done
所以我这样做了:
# for each 4 digits in the list
# add "a[" and "];" before and after the four numbers
# so awk array is "a[2741]; a[2740]; a[2739]; ...."
awkarray=$(awkarray=$(<<<"$list" sed -E 's/[0-9]{4}/a[&];/g')
awk -vfileout="$fileout" '
BEGIN {'"$awkarray"'}
in a {
print [=10=] > fileout "_" "_Output.txt"
}
' "$datadir"/*.txt
因此,首先我转换列表以将其作为数组加载到 awk 中。该数组只有索引,所以我可以检查数组中是否存在索引,数组元素没有值。然后我简单地检查数组中是否存在 $2 和 $3 的串联,如果存在,输出将重定向到正确的文件名。
记得引用你的变量。 $datadir/*.txt
可能不起作用,当 datadir
包含空格时,执行 "$datadir"/*.txt
。 awk 脚本中的换行符
以上可以删除,所以如果你更喜欢oneliner:
awk -vfileout="$fileout" 'BEGIN {'"$(<<<"$list" sed -E 's/[0-9]{4}/a[&];/g')"'} in a { print [=11=] > fileout "_" "_Output.txt" }' "$datadir"/*.txt
我有大量的文本文件需要遍历。在循环时我想找到与字符串列表匹配的行并将每个字符串提取到一个单独的文件夹中。我有一个变量 "ij" 需要拆分为 "i" 和 "j" 以匹配两列。例如 2733 需要拆分为 27 和 33。脚本搜索每个文本文件并提取 i 和 j 为 2733 的每一行。
这里的问题是我有将近 100 个不同的字符串,因此需要大约 35 个小时才能完成所有这些字符串。
有没有办法在一个循环中将所有变量提取到单独的文件中?我试图遍历一个文本文件,提取我的字符串列表中的所有行并将它们输出到它们自己的文件夹,然后移至下一个文本文件。
我目前正在使用 "awk" 命令来完成此操作。
list="2741 2740 2739 2738 2737 2641 2640 2639 2638 2541 2540 2539 2538 2441 2440 2439 2438 2341 2340 2339 2241 2240 2141"
for string in $list
do
for i in ${string:0:2}
do
for j in ${string:2:2}
do
awk -v i=$i -v j=$j '==j && ==i {print [=11=]}' $datadir/*.txt >"${fileout}${i}_${j}_Output.txt"
done
done
done
所以我这样做了:
# for each 4 digits in the list
# add "a[" and "];" before and after the four numbers
# so awk array is "a[2741]; a[2740]; a[2739]; ...."
awkarray=$(awkarray=$(<<<"$list" sed -E 's/[0-9]{4}/a[&];/g')
awk -vfileout="$fileout" '
BEGIN {'"$awkarray"'}
in a {
print [=10=] > fileout "_" "_Output.txt"
}
' "$datadir"/*.txt
因此,首先我转换列表以将其作为数组加载到 awk 中。该数组只有索引,所以我可以检查数组中是否存在索引,数组元素没有值。然后我简单地检查数组中是否存在 $2 和 $3 的串联,如果存在,输出将重定向到正确的文件名。
记得引用你的变量。 $datadir/*.txt
可能不起作用,当 datadir
包含空格时,执行 "$datadir"/*.txt
。 awk 脚本中的换行符
以上可以删除,所以如果你更喜欢oneliner:
awk -vfileout="$fileout" 'BEGIN {'"$(<<<"$list" sed -E 's/[0-9]{4}/a[&];/g')"'} in a { print [=11=] > fileout "_" "_Output.txt" }' "$datadir"/*.txt