首页 > 解决方案 > 将 csv 文件的 field(column) 中的每个值作为参数传递给 awk。Unix

问题描述

我编写了一个脚本,$path它将i+1检查$path.

#! /bin/bash
echo "Enter number of records"
read num
count=1
while [ $count -le $num ]
do
 echo "Enter path"
 read path
 var2=`echo "${path##*/}"`
 var3=`awk '{for(i=1;i<NF;i++) if ($i == "'${var2}'"} print $(i+1)}' ${path} | head -1`
 echo "done,$var3" >> result.csv
 ((count++))
done

如果值为或,则内容$path如下/c/training/sample.sh/c/training/textfile

样本.sh

#!/bin/bash
#sample.sh 120
<psuedo-code>

文本文件.txt

textfile.txt 0
This is random text

result.csv或输出 csv 文件的外观

done,120
done,0

因此,不是每次都读取路径,而是如何读取所有路径,如果它们存储在单独的 csv 文件中。

样本输入.csv

/c/training/sample.sh,User1
/c/training/textfile.txt,USer2

如何实现awk上述内容,以便它读取Sampleinput.csv字段 1 中的每个值并执行相同的操作

标签: bashcsvunixawkgit-bash

解决方案


我认为这是您使用 GNU awk 对 gensub()、ARGIND、nextfile 和 ENDFILE 所做的尝试(未经测试):

#!/usr/bin/env bash

IFS= read -p 'Enter number of records: ' -r num

awk -v maxFiles="$num" '
    BEGIN { OFS="," }
    ARGIND == 1 {
        if ( ARGC < maxFiles ) {
            ARGV[ARGC++] = gensub(/,.*/,"",1)
        }
        next
    }
    FNR == 1 {
        fname = gensub(".*/","",1,FILENAME)
    }
    {
        for (i=1; i<=NF; i++) {
            if ( gensub(/^#+/,"",1,$i) == fname ) {
                val = $(i+1)
                nextfile
            }
        }
    }
    ENDFILE {
        if ( ARGIND > 1 ) {
            print "done", val
        }
        val = 0
    }
' Sampleinput.csv > result.csv

推荐阅读