从 awk 制作脚本

0 awk shell-script

我运行一个命令来重新格式化我的文本文件:

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' filename.txt > seqXXX.txt
Run Code Online (Sandbox Code Playgroud)

我怎样才能把它变成一个脚本,这样我就不必每次都输入命令了?我阅读了一些关于如何做到这一点的文章,但变得更加困惑

Kus*_*nda 5

如何做到这一点在某种程度上取决于您希望将命令的哪一部分转换为脚本。我在下面给你三个变体:

  1. awk为脚本程序本身。
  2. 整个命令作为一个脚本。
  3. 命令作为shell函数。

awk程序可以变成一个脚本,看起来像

#!/usr/bin/awk -f

BEGIN { FS = "," }

{
    if ($6 < 0)
        print $1$2,"   "$3$4,$5$6
    else
        print $1$2,"   "$3$4$5,$6
}
Run Code Online (Sandbox Code Playgroud)

这首先将字段分隔符设置为逗号,然后在输入的每一行上运行代码块。

#!这里使用的-line 使得当你运行脚本文件时,它会像你awk -f script.awk在命令行上写的一样被执行。应该调整第一行使用的路径以指向awk系统上正确的解释器(请参阅 的输出command -v awk)。

使用 使此文件可执行后chmod +x script.awk,它将用作

$ ./script.awk filename.txt >seqXXX.txt
Run Code Online (Sandbox Code Playgroud)

该命令可以像这样放入 shell 脚本中:

#!/bin/sh

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' "$@"
Run Code Online (Sandbox Code Playgroud)

在这里,我基本上只是将命令移植到 shell 脚本中。命令"$@"末尾的位awk将替换为您提供给脚本的所有命令行参数(可能只是您的单个输入文件的名称)。

制作此可执行文件后,您可以将其用作

$ ./script.sh filename.txt >seqXXX.txt
Run Code Online (Sandbox Code Playgroud)

如果文件名是静态的并且永远不会改变,请将它们也放入脚本中:

#!/bin/sh

awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
               else print $1$2,"   "$3$4$5,$6;}' filename.txt >seqXXX.txt
Run Code Online (Sandbox Code Playgroud)

然后在命令行上调用您的脚本,而无需任何额外的参数或重定向。


您可以将命令转换为 shell 函数。这几乎就像一个别名,但通常更灵活一些:

myreformat () {
    awk -F, '{if ($6<0) print $1$2,"   "$3$4,$5$6;
                   else print $1$2,"   "$3$4$5,$6;}' "$@"
}
Run Code Online (Sandbox Code Playgroud)

这将放在您通常放置 shell 别名等的任何地方(~/.bashrc如果您正在使用bashshell ,则可能在其中)。该函数将在您启动的下一个shell 会话中可用。

它的调用方式与上面的 shell 脚本变体几乎相同:

$ myreformat filename.txt >seqXXX.txt
Run Code Online (Sandbox Code Playgroud)