首页 > 解决方案 > awk 脚本从 txt 文件中读取数据

问题描述

我正在尝试创建一个 awk 脚本来从 txt 文件中读取数据并创建一个输出脚本。是否可以使用 awk 创建输出?

while IFS=',' read -r a b c; do echo "source "$a" and target "$b" and line "$c"" ; done < test.txt

测试.txt

"x","y","8"
"x","6"
"y","7"

输出:

source "x" and target "y" and line "8"
source "x" and target "6" and line 
source "y" and target "7" and line

预期输出:

"source x and target y and line 8"
"source x and line 6"
"target y and line 7"

标签: bashawk

解决方案


我发现很难从提供的输入和输出中清楚地辨别需求。但是,如果我们稍微调整您的输入(与 Corentin 的建议略有不同,我们可以提供一个工作 awk 脚本来提供您所需的输出。

让我们从一个假设开始:

输入格式如下:

<source>,<target>,<line>

现在我们可以编写这个 awk 脚本:

awk -F, '
BEGIN { 
  split( "source target line" , value , " " ) 
}

{
  output=""
  for ( field = 1 ; field <=  length(value) ; field++  ) 
  {
    if ( $field ) {
      output = output  ( output ? " and " : "" ) value[ field ]   " " $field
    }
  }
  print "echo " output
}' << EOF
"x","y","8"
"x",,"6"
,"y","7"
EOF

老实说,上面的代码有点偏离目标。具体来说,我没有处理输入或输出中的双引号。我认为如果我们谈论引号,解决方案的可读性会降低。从技术上讲,如果输入中的引号是为了保护逗号(就像 CSV 一样),我会考虑用支持 csv 的 python(或其他语言)编写这个程序。

这是上述程序的输出:

echo source "x" and target "y" and line "8"
echo source "x" and line "6"
echo target "y" and line "7"

推荐阅读