仍然难以确定如何使用以下代码来保存给定文件的内容,该代码试图根据文件中的特定正则表达式匹配来重命名该文件(即,在给定文件中,总会有一个SMILE
后跟12位数字,例如SMILE000123456789
)。
for f in FILENAMEX_*; do awk '/SMILE[0-9]/ {OUT=$f ".txt"}; OUT {print >OUT}' ${f%.*}; done
这段代码正确地命名了文件,但只是简单地打印出匹配后的所有内容,而不是文件的全部内容。
当前要处理的文件列表没有扩展名(下一步需要一个扩展名),因为我csplit
用来解析较大文件中的内容。
有两个问题:第一个是在awk程序中使用shell变量,第二个是awk程序本身的逻辑。
要在awk中使用shell变量,可以使用
awk -v var="$var" '<program>'
然后var
在awk内部使用。
对于第二个问题:如果某行与您的图案不匹配OUT
且未设置,则不会打印该行。在与图案匹配的第一行之后,OUT
进行设置并打印。由于匹配项可能在文件中的任何位置,因此您必须至少存储行直到第一个匹配项。
这是一个应该工作的版本,非常接近您的方法:
for f in FILENAMEX_*; do
awk -v f="${f%.*}" '
/SMILE[0-9]/ {
out=f".txt"
for (i=1;i<NR;++i) # Print file so far
print lines[i] > out
}
out { print > out } # Match has been seen: print
! out { lines[NR] = $0 } # No match yet: store
' "$f"
done
您可以FILENAME
通过一次awk的调用来进行一些欺骗性工作,或使用类似方法完成所有工作,但是由于主要目的是查找文件中是否存在模式,因此最好使用grep -q
,它返回退出状态如果找到该模式,则为0:
for f in FILENAMEX_*; do grep -q 'SMILE[0-9]' "$f" && cp "$f" "${f%.*}".txt; done
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句