我正在尝试一个脚本,其中文件[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工具来做到这一点。
由于
答案 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