如果列为空,awk打印一些东西

时间:2015-07-24 04:54:50

标签: bash awk sed

我正在尝试一个脚本,其中文件[file.txt]有很多列,如

abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha| |325
xyz| |abc|123

我想使用awk命令在bash脚本中获取列列表如果列为空它应该打印空白否则打印列值

我尝试了以下可能性,但它无法正常工作

cat file.txt | awk -F "|" {'print $2'} | sed -e 's/^$/blank/' // Using awk and sed
cat file.txt | awk -F "|" '!$2 {print "blank"} '
cat file.txt | awk -F "|" '{if  ($2 =="" ) print "blank" } '

请让我知道如何使用awk或任何其他bash工具来做到这一点。

由于

3 个答案:

答案 0 :(得分:5)

您可以使用此sed -r 's/\| +\|/\|blank\|/g' File abc|pqr|lmn|123 pqr|xzy|321|azy lee|cha|blank|325 xyz|blank|abc|123 脚本执行此操作:

|

如果您不想要sed -r 's/\| +\|/\|blank\|/g; s/\|/ /g' File abc pqr lmn 123 pqr xzy 321 azy lee cha blank 325 xyz blank abc 123

awk

Else awk '{gsub(/\| +\|/,"|blank|")}1' File abc|pqr|lmn|123 pqr|xzy|321|azy lee|cha|blank|325 xyz|blank|abc|123

import csv
import random

with open('filename.txt') as fin:
    lines = fin.readlines()
    random.shuffle(lines)

    rnd_str = []
    for i, line in enumerate(lines):
        if i >= 0 and i < 6800:
            rnd_str.append(line)

    r = rnd_str

    dict1 = {}
    for row in r:
        a, b, v = row.split()
        dict1.setdefault((a,b),[]).append(v)

with open ("filename2.txt") as f:
    dict2 = {}
    r = csv.reader(f,delimiter="\t")        

    dict2 = {}
    for row in r:
        a, b, v = row.split()
        dict2.setdefault((a,b),[]).append(v)

    count = 0
    for key1 in dict1:
        for key2 in dict2:
            if (key1[0] == key2[0]) and ((float(key1[1]) - (float(key2[1]))) < 0):
                count += 1

print(count)

答案 1 :(得分:4)

我认为您正在寻找的是

awk -F '|' '{print match($2, /[^ ]/) ? $2 : "blank"}' file.txt

match(str, regex)返回正则表达式第一场比赛的str中的位置,如果没有匹配则返回0。所以在这种情况下,如果字段2中有一些非空字符,它将返回一个非零值。注意,在awk中,字符串中第一个字符的索引是1,而不是0。

在此,我假设您只对一个列感兴趣。

如果您希望能够从bash变量指定替换字符串,最好的解决方案是使用-v开关将bash变量传递到awk程序中:

awk -F '|' -v blank="$replacement" \
    '{print match($2, /[^ ]/) ? $2 : blank}' file.txt

这种机制避免了转义元字符的问题。

答案 2 :(得分:2)

您可以像这样使用awk:

awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) if ($i ~ /^ *$/) $i="blank"} 1' file
abc|pqr|lmn|123
pqr|xzy|321|azy
lee|cha|blank|325
xyz|blank|abc|123