根据内部文本匹配重命名文件 - 保留文件的所有内容

时间:2017-10-17 01:48:42

标签: awk

仍然无法确定如何使用以下代码来确定如何保留给定文件的内容,该代码尝试根据所述文件中的特定正则表达式匹配重命名文件(即在给定文件中始终存在一个{{ 1}}后跟12位数,例如SMILE)。

SMILE000123456789

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

要处理的文件列表目前没有扩展名(他们需要一个用于下一步),因为我使用for f in FILENAMEX_*; do awk '/SMILE[0-9]/ {OUT=$f ".txt"}; OUT {print >OUT}' ${f%.*}; done 来解析更大文件中的内容。

2 个答案:

答案 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
相关问题