【问题标题】:passing awk variable to bash script将 awk 变量传递给 bash 脚本
【发布时间】:2013-09-01 17:01:44
【问题描述】:

我正在编写一个 bash/awk 脚本来处理一个目录下的数百个文件。它们都有“localprefs”的名称后缀。目的是从每个文件中提取两个值(它们用“”引用)。我也想使用相同的文件名,但没有名称后缀。

这是我到目前为止所做的:

#!/bin/bash

for file in *  # Traverse all the files in current directory.
   read -r name < <(awk ' $name=substr(FILENAME,1,length(FILENAME)-10a) END {print name}' $file) #get the file name without suffix and pass to bash. PROBLEM TO SOLVE!
   echo $name # verify if passing works.
   do
   awk  'BEGIN { FS = "\""} {print $2}' $file #this one works fine to extract two values I want.
   done

exit 0

我可以使用

awk '{print substr(FILENAME,1,length(FILENAME)-10)}' 提取不带后缀的文件名,但我被困在如何将其作为变量传递给 bash,我将用作输出文件名(我在这里阅读了有关此主题的所有帖子,但也许我很愚蠢,它们都不适合我)。

如果有人能对此有所了解,尤其是以“阅读”开头的那一行,您将不胜感激。

非常感谢。

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    试试这个:

    #!/bin/bash
    
    dir="/path/to/directory"
    
    for file in "$dir"/*localprefs; do
        name=${file%localprefs}  ## Or if it has a .: name=${file%.localprefs}
        name=${name##*/}  ## To exclude the dir part.
        echo "$name"
        awk 'BEGIN { FS = "\""} {print $2}' "$file"  ## I think you could also use cut: cut -f 2 -d '"' "$file"
    done
    
    exit 0
    

    【讨论】:

    • 它就像魅力一样。太感谢了!我将使用你的模板作为我的模板来优化输出。
    • #!/bin/bash dir="/path/to/dir" diro="/path/to/dirout" for file in "$dir"/*localprefs; do name=${file%localprefs} ## 或者如果它有一个 .: name=${file%.localprefs} name=${name##*/}; ## 排除目录部分。 touch "$diro"/"$name" awk 'BEGIN { FS = "\""} {print $2}' "$file" >>"$diro"/"$name" done exit 0
    • 如何编写for循环先获取名称并使用touch创建文件,然后运行awk部分将两行放入文件中?看上面。它非常接近,但在输出文件中有两个重复项
    • @user46292 您的脚本似乎是正确的方法。错误是什么? awk 总是产生两条线吗?我们还会假设$diro 存在吗?或者你必须创建它?
    • 根据您的建议,它现在只生成两行。再次感谢。
    【解决方案2】:

    只取 sbase 名称,你甚至不需要 awk:

    for file in * ; do
       name="${file%.*}"
       etc
    done
    

    【讨论】:

    • 这是我从您的建议中得到的:第 12 行:意外标记附近的语法错误 FILE=awk '{print substr(FILENAME,1,length(FILENAME)-10)}'' line 12: FILE=awk '{print substr(FILENAME,1,length(FILENAME)-10)}''
    • 不,不,不。使用$()
    • 已编辑 - 使用反引号是一种习惯的力量
    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 2010-12-13
    • 1970-01-01
    • 2012-01-23
    • 2016-11-13
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多