unix 如果同名的.json文件包含特定字符串,则使用bash重命名.tsv文件

rekjcdws  于 2022-11-04  发布在  Unix
关注(0)|答案(2)|浏览(173)

对于每个主题,我都有一个文件夹,每个任务(gram、plaus和sem)有两个文件(.json和.tsv),每个主题总共有6个文件。每对.tsv/.json文件除了文件扩展名外都有相同的名称。例如,一个主题的文件夹可能包含:xxx.tsv,xxx. json,yyy.tsv,yyy. json,zzz.tsv,zzz. json.
我想查看每个.json文件,看看它是否包含字符串“Gram”、“Plaus”或“Sem”,并将相应的.tsv文件重命名为在找到的文件扩展名之前包含_Gram、_Plaus或_Sem。现在,我的代码(在更改到主题文件夹后)如下所示:

find -type f -name "*_regressors.json" -print0 | while IFS= read -r -d '' filename
do
    if [[grep -q 'Sem' "$filename"]]; then
        sem_name="${filename%.*}" 
    mv ${sem_name}.tsv ${sem_name}_sem.tsv
    fi 

    if [[grep -q 'Plaus' "$filename"]]; then
    plaus_name="${filename%.*}"
    mv ${plaus_name}.tsv ${plaus_name}_plaus.tsv
    fi

    if [[grep -q 'Gram' "$filename"]]; then
        gram_name="${filename%.*}"
    mv ${gram_name}.tsv ${gram_name}_gram.tsv
    fi
done

我想知道awk命令是否能更好地工作?我是bash和unix脚本的新手,所以任何想法都非常感谢!

von4xj4u

von4xj4u1#

在这种情况下,使用awk而不是grep确实有意义:


# !/bin/bash

find . -type f -name "*_regressors.json" -print0 |
while IFS= read -r -d '' filename
do
    prefix=${filename%.*}
    suffix=$(
        awk '
            match($0,/Sem|Plaus|Gram/) {
                print tolower(substr($0,RSTART,RLENGTH))
                exit
            }
        ' "$filename"
    )
    mv "$prefix.tsv" "${prefix}_$suffix.tsv" 
done

但是如果不进行解析而尝试匹配JSON文件中的文字字符串,可能会产生意外的结果,

h6my8fg2

h6my8fg22#

请您尝试以下操作:


# !/bin/bash

find . -type f -name "*_regressors.json" -print0 | while IFS= read -r -d '' f; do
    if str=$(grep -wE "Sem|Plaus|Gram" "$f"); then              # search the json file for the strings
        str=$(head -n 1 <<< "$str" | tr [:upper:] [:lower:])    # pick the 1st match and lower the case
        base=${f%.json}                                         # remove the extention
        echo mv -- "${base}.tsv" "${base}_${str}.tsv"           # rename the file
    fi
done
  • head命令选择第一个匹配的行,以防有多个匹配。(这可能是想多了。)
  • 如果输出的命令看起来不错,请将echo放在mv之前并运行。

相关问题