【发布时间】:2015-06-24 03:25:24
【问题描述】:
以下命令完全符合我的需要 它检查列中是否存在字符串,如果不存在则添加逗号。
awk -F, -v OFS=, '!/Reading Comprehension/ { $5 = $5 "," } 1' somefile.csv \
| awk -F, -v OFS=, '!/Sentence Skills/ { $6 = $6 "," } 1' \
| awk -F, -v OFS=, '!/Arithmetic/ { $7 = $7 "," } 1' \
| awk -F, -v OFS=, '!/College Level Math/ { $8 = $8 "," } 1' \
| awk -F, -v OFS=, '!/Elementary Algebra/ { $9 = $9 "," } 1' > endfile.csv
如何使用这个串联/管道命令并将其转换为 awk 循环?
我在想这样的事情:
awk -F, OFS=,
i = Reading Comprehension, Sentence Skills, Arithmetic, College Level Math, Elementary Algebra
j = 5,6,7,8,9
{for ((i<=NF; j<=NF) '!/i/ { $j = $j "," } 1')}
示例输入:
last,first,A00XXXXXX,1888-01-01,2015-05-13,Elementary Algebra 34
last,first,A00XXXXXX,1888-01-01,2015-05-13,Reading Comprehension 97,Sentence Skills 104,College Level Math 76,Elementary Algebra 115
last,first,A00XXXXXX,1888-01-01,2015-05-13,Sentence Skills 104,Arithmetic 08,College Level Math 76,Elementary Algebra 115
last,first,A00XXXXXX,1888-01-01,2015-05-13,College Level Math 76,Elementary Algebra 115
last,first,A00XXXXXX,1888-01-01,2015-05-13,Sentence Skills 104,Elementary Algebra 115
样本输出:
last,first,A00XXXXXX,1888-01-01,2015-05-13,,,,,Elementary Algebra 34
last,first,A00XXXXXX,1888-01-01,2015-05-13,Reading Comprehension 97,Sentence Skills 104,Arithmetic 08,College Level Math 76,Elementary Algebra 115
last,first,A00XXXXXX,1888-01-01,2015-05-13,,Sentence Skills 104,,College Level Math 76,Elementary Algebra 115
last,first,A00XXXXXX,1888-01-01,2015-05-13,,,,College Level Math 76,Elementary Algebra 115
last,first,A00XXXXXX,1888-01-01,2015-05-13,,Sentence Skills 104,,,Elementary Algebra 115
我还在学习 AWK,对如何进行 awk 循环只有部分了解。
任何帮助都将不胜感激,并且答案的解释真的很棒。
【问题讨论】:
-
最好发布一些示例输入/所需的输出。关于代码本身,管道 awk 5 次似乎太多了。注意你可以说
awk '/condition/ {do things} /condition2/ {do other things}' file -
@fedorqui 谢谢,我也想这样做,但仍然给我留下了一个超长的命令。我试图找到最有效且最容易阅读的方法
-
高效!= 视觉上的美丽。管道意味着一遍又一遍地遍历所有数据。再次:发布一些数据,以便我们进行进一步检查。看起来您在逗号分隔的文件中附加逗号,但不确定具体如何
-
@fedorqui 我添加了示例输入和输出,就像我提到的那样,管道命令完全符合我的需要。我只是想把它清理一下