【发布时间】:2016-11-11 11:47:33
【问题描述】:
我正在编写一个替换前导/尾随空格的函数 从列中,如果列中没有值,则将其替换为 null。 功能对于一列工作正常,但我如何修改它以用于多列。
功能:
#cat trimfunction
#!/bin/bash
function trim
{
vCol=$1 ###input column name
vFile=$2 ###input file name
var3=/home/vipin/temp ###temp file
awk -v col="${vCol}" -f /home/vipin/colf.awk ${vFile} > $var3 ###operation
mv -f $var3 $vFile ###Forcefully mv
}
AWK 脚本:
#cat colf.awk
#!/bin/awk -f
BEGIN{FS=OFS="|"}{
gsub(/^[ \t]+|[ \t]+$/, "", $col) ###replace space from 2nd column
}
{if ($col=="") {print $1,"NULL",$3} else print $0} ###replace whitespace with NULL
输入文件:第二列中的前导/尾随/空白
#cat filename.txt
1| 2016-01|00000321|12
2|2016-02 |000000432|13
3|2017-03 |000004312|54
4| |000005|32
5|2017-05|00000543|12
脚本:
#cat script.sh
. /home/vipin/trimfunction
trim 2 filename.txt
输出文件:在第二列中删除了前导/尾随/空白
#./script.sh
#cat filename.txt
1|2016-01|00000321|12
2|2016-02|000000432|13
3|2017-03|000004312|54
4|NULL|000005
5|2017-05|00000543|12
如果输入文件如下所示 - (第二个中的白色/前导/尾随空格 和文件的第 5 列)
1|2016-01|00000321|12|2016-01 |00000
2|2016-02 |000000432|13| 2016-01|00000
3| 2017-03|000004312|54| |00000
4| |000005|2016-02|0000
5|2017-05 |00000543|12|2016-02 |0000
如何实现低于输出 - (所有前导/尾随空格修剪和 在第 2 列和第 5 列中用 NULL 替换空格)类似于修剪 2 5 filename.txt trim 2 5 filename.txt ###将两列名称作为 输入
1|2016-01|00000321|12|2016-01|00000
2|2016-02|000000432|13|2016-01|00000
3|2017-03|000004312|54|NULL|00000
4|NULL|000005|2016-02|0000
5|2017-05|00000543|12|2016-02|0000
【问题讨论】:
-
您真的想针对特定列还是只针对每个空列执行此操作?在您的示例中包含一个空列,如果发生这种情况,您不希望对其进行修改。顺便说一句,非常明确的问题!
-
@EdMorton - 仅适用于我将通过的特定列:trim 2 5 filename.txt OR trim 4 6 119 filename.txt
标签: bash function unix awk arguments