Awk 基于内部文本匹配重命名文件-保留文件的所有内容

Awk 基于内部文本匹配重命名文件-保留文件的所有内容,awk,Awk,仍然无法确定如何使用以下代码保留给定文件的内容,这些代码正试图根据该文件中的特定正则表达式匹配来重命名该文件(即,在给定文件中,始终会有一个SMILE后跟12位数字,例如SMILE000123456789) 这段代码正确地命名了文件,但只是在匹配后打印出所有内容,而不是文件的全部内容 要处理的文件列表当前没有扩展名(下一步需要扩展名),因为我使用了csplit从一个较大的文件中解析出内容。有两个问题:第一个是在awk程序中使用shell变量,第二个是awk程序本身的逻辑 要在awk中使用shel

仍然无法确定如何使用以下代码保留给定文件的内容,这些代码正试图根据该文件中的特定正则表达式匹配来重命名该文件(即,在给定文件中,始终会有一个
SMILE
后跟12位数字,例如
SMILE000123456789

这段代码正确地命名了文件,但只是在匹配后打印出所有内容,而不是文件的全部内容


要处理的文件列表当前没有扩展名(下一步需要扩展名),因为我使用了
csplit
从一个较大的文件中解析出内容。

有两个问题:第一个是在awk程序中使用shell变量,第二个是awk程序本身的逻辑

要在awk中使用shell变量,可以使用

awk -v var="$var" '<program>'
您可以使用
FILENAME
或类似工具进行一些技巧,以便在单个awk调用中完成所有操作,但由于主要目的是查找文件中是否存在模式,因此最好使用
grep-q
,如果找到模式,则返回0的退出状态:

for f in FILENAMEX_*; do grep -q 'SMILE[0-9]' "$f" && cp "$f" "${f%.*}".txt; done

也许是一种不同的方法,只需分别执行每个步骤

伪码

for all files with some given text
    extract text
    rename file

我不完全理解您的问题,但您的问题中至少有一个是将shell变量放入awk:谢谢Benjamin,这至少已经解决了。基本上,目标是根据文件中的特定文本匹配来重命名每个文件。它正在这样做(即重命名文件),但输出文件只有匹配后的文本。我仍然需要保留整个文件,但只更改了名称。希望这更有意义。哦,我现在明白了。对于一个文件,类似于
if grep-q targetText$file;然后是/bin/mv文件newFile;在$file中找不到else echo targetText" ; fi
您似乎已经找到了
for
循环。祝你好运。谢谢本杰明,这是一些优秀的代码。我还没有尝试第一个块-快速尝试第二个块会将匹配结果输出到终端窗口…?第一个块和第二个块保留原始文件名。经过一番努力,终于在@Benjamin W answer上得到了它对于文件名x_2;中的f;dovar=$(grep'SMILE[0-9]'$f)和&cp“$f”“${var%.}”.txt;'是的,也许你是对的——也许回到perl的工作马上来。
for f in FILENAMEX_*; do grep -q 'SMILE[0-9]' "$f" && cp "$f" "${f%.*}".txt; done
for all files with some given text
    extract text
    rename file