bash - 将 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 中的每个值并执行相同的操作
解决方案
我认为这是您使用 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
推荐阅读
- spacemacs - Spacemacs - 如何关闭箭头键
- javascript - 通过 touchstart 导致布局更改时防止与其他元素交互
- unity3d - 旋转父对象而不旋转实例化的子对象
- python - 如何在 Python 中将 cplex 或 gurobi 求解器与 cvxopt 一起使用?
- python - 熊猫:如何用另一列中的字符串填充nan一列
- download - 从 Flash 切换到 HTML5 后,有没有办法导出 Adobe Connect 记录?
- html - 如何从 dart 中的属性名称获取属性值(dart 中的 html 属性中的 _EVENTVALIDATION)?
- python - 从数据框中的现有数据创建新的连续指标 - 将一列中的类别与两个连续列合并
- node.js - 如何使用Nodejs递归列出所有目录
- winapi - 如何确定 HID 键盘是否是远程的?