【问题标题】:passing word in a command在命令中传递单词
【发布时间】:2017-05-02 23:20:06
【问题描述】:

我实际上是 shell 脚本的新手。我有一个 file.txt 写成 662,2016-12-31。

示例:#cat file.txt

662,2016-12-31

我有另一个带有命令的 script.sh 文件 '{打印 $2",0"$1",field1,field2}'

示例:#cat script.sh

'{打印 $2",0"$1",field1,field2}'

我想在 field1 打印 662,在 field2 打印 2016-12-31。能做到吗?

【问题讨论】:

  • 我认为您应该重新表述您的问题,以便更清楚 - 这是在 Stack Overflow 上获得出色答案的秘诀。现在我不知道你到底想做什么。
  • 说实话,没有。但是,请看一下:cat file.txt | perl -ne 'print "field1: $1 field2: $2\n" if /(.*),(.*)/'。您现在可以修改print 之后的部分以重新排序您的字段,或在其间添加一些字符。如果这是你需要的。
  • "cat install_offer1.csv | sed 's/"880//g' |sed 's/"88//g'| sed 's/"//g'|sed 's/ ,019/,19/g'| nawk -F, '{print $1",0"$2",field1,field2"}' > install_offer2.csv" 实际上这是完整的命令。我只想在 field1 和 2016-12-31 的位置打印 662在 field2 的位置。所以每当我更改 file.txt 时,该命令也会更改,因为它总是从 file.txt 中获取参数。
  • 您希望输出行看起来像 argument2,0argument1,662,2016-12-31 吗?在这种情况下,你可以不用(n)awkprintf "%s,0%s,%s\n" "$2" "$1" "$(cat file.txt)"

标签: linux bash shell arguments


【解决方案1】:

"...| nawk -F, '{print $1",0"$2",field1,field2"}' > install_offer2.csv" 实际上这是完整的命令。我只想在field1的地方打印662,在field2的地方打印2016-12-31。因此,每当我更改 file.txt 时,该命令也会更改,因为它总是从 file.txt 中获取参数。

简单的部分是将文件中的字段读入变量:

IFS=, read field1 field2 <file.txt

不完全,但几乎如此简单的部分是将这些变量的值插入到nawk 命令中,因为它位于单引号内,因此不会发生 shell 参数扩展。以下是两种可能的方法。

  1. 使用选项-v 将shell 变量分配给awk 变量:

    …|nawk -F, -v field1=$field1 -v field2=$field2 '{print $1",0"$2","field1","field2}'
    

    请注意,field1field2 必须出现在 " " 字符串之外。

  2. 通过关闭并重新打开 ' 引用直接插入 shell 变量:

    …|nawk -F, '{print $1",0"$2",'$field1,$field2'"}'
    

如果我们看第二种方式,就会想到另一个更简单的可能性,它不需要read变量的步骤:

…|nawk -F, '{print $1",0"$2",'$(<file.txt)'"}'

【讨论】:

    【解决方案2】:

    这可以使用awk 命令轻松实现。您可以检查以下简单的 shell 脚本,

    #!/bin/sh
    
    InputData=`cat file.txt`
    
    field1=`echo $InputData | awk -F "," '{print $1}'`
    field2=`echo $InputData | awk -F "," '{print $2}'`
    
    echo "field1=$field1"
    echo "field2=$field2"
    

    输出:

    field1=662
    field2=2016-12-31
    

    【讨论】:

      【解决方案3】:

      你可以使用cut命令获取field1和field2的值,分隔符为","

      field1=`cat file.txt | cut -d "," -f1`
      field2=`cat file.txt | cut -d "," -f2`
      
      '{print $2",0"$1",$field1,$field2}'
      

      【讨论】:

        猜你喜欢
        • 2020-05-29
        • 1970-01-01
        • 2021-07-20
        • 2011-06-26
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多