如何仅在某些字段上执行awk命令

时间:2017-10-10 23:02:13

标签: linux bash unix awk sed

我正在使用CSV列:

info,example-string,super-example-string,otherinfo

我想得到:

example-string super example string

现在,我正在运行以下命令:

awk -F ',' '{print $3}' | sed "s/-//g"

但是,我必须paste这些行合并$2$3

无论如何都要做这样的事情?

awk -F ',' '{print $2" "$3}' | sed "s/-//g"

除了,仅在$3$2上执行sed命令的地方?我稍后会担心如果线路不匹配,数据可能会错位。

请注意:我需要保留SED命令的管道。我只是使用了一个简单的例子,但我之后也运行了很多命令。

2 个答案:

答案 0 :(得分:3)

尝试:

$ awk -F, '{gsub(/-/," ",$3); print $2,$3}' file
example-string super example string

如何运作

  1. -F,

    这告诉awk使用逗号作为字段分隔符。

  2. gsub(/-/," ",$3)

    这将使用空格替换字段3中的所有-

  3. print $2,$3

    这会打印字段2和3.

  4. 使用管道的示例

    $ echo 'info,example-string,super-example-string,otherinfo' | awk -F, '{gsub(/-/," ",$3); print $2,$3}'
    example-string super example string
    

    在sed:

    的管道中
    $ echo 'info,example-string,super-example-string,otherinfo' | awk -F, '{gsub(/-/," ",$3); print $2,$3}' | sed 's/string/String/g'
    example-String super example String
    

答案 1 :(得分:1)

虽然最好的解决方案是使用单个sed或使用单个awk。由于您已请求使用awk和sed解决方案,因此提供此功能。另外考虑您的实际数据将与示例Input_file相同。

awk -F, '{print $2,$3}' Input_file | sed 's/\([^ ]*\)\([^-]*\)-\([^-]*\)-\([^-]*\)/\1 \2 \3 \4/'

输出如下。

example-string  super example string