仍然无法确定如何使用以下代码来确定如何保留给定文件的内容,该代码尝试根据所述文件中的特定正则表达式匹配重命名文件(即在给定文件中始终存在一个{{ 1}}后跟12位数,例如SMILE
)。
SMILE000123456789
此代码正确命名文件,但只是在匹配后打印出所有内容,而不是文件的全部内容。
要处理的文件列表目前没有扩展名(他们需要一个用于下一步),因为我使用for f in FILENAMEX_*; do awk '/SMILE[0-9]/ {OUT=$f ".txt"}; OUT {print >OUT}' ${f%.*}; done
来解析更大文件中的内容。
答案 0 :(得分:2)
有两个问题:第一个是在awk程序中使用shell变量,第二个是awk程序本身的逻辑。
要在awk中使用shell变量,可以使用
awk -v var="$var" '<program>'
然后在awk中使用var
。
对于第二个问题:如果一行与您的模式不匹配且未设置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
,如果找到模式,则返回退出状态:
for f in FILENAMEX_*; do grep -q 'SMILE[0-9]' "$f" && cp "$f" "${f%.*}".txt; done
答案 1 :(得分:0)
也许是一种不同的方法,只是分别做每一步......
即伪代码
for all files with some given text
extract text
rename file