我有一个csv文件:
field1, field2
a,b
c,d
...
我想检查两个值是否都是正整数,如果是,则连接它们并写入输出文件。我有一段时间搞乱awk,但它根本不起作用并产生任何输出。
所以,如果输入是
1234,5678
123,asdf
123a,999
111,2222
预期输出为:
12345678
1112222
答案 0 :(得分:2)
我的第一个想法是,sed将提供最简单的解决方案:
sed -Ene '/^[0-9,]+$/s/,//gp' input.txt
(请注意,您的sed可能需要-r
而不是-E
。请查看man sed
了解详情。)
当然,用awk可以实现同样的目的。
awk '/^[0-9,]+$/ {gsub(/,/,"");print}' input.txt
请注意,正如我写的那样,他们应该处理任意数量的字段,并且没有针对空字段的任何保护。如果你想限制自己仅使用两个非空字段的行,那应该是一个简单的正则表达式更改:
sed -Ene '/^[0-9]+,[0-9]+$/s/,//p' input.txt
或
sed -ne '/^[0-9][0-9]*,[0-9][0-9]*$/s/,//p' input.txt
或
awk '/^[0-9]+,[0-9]+$/ {sub(/,/,"");print}' input.txt
这些解决方案通过简单地将整行视为模式来避免考虑“字段”。如果您更喜欢解析字段,那么你对sed运气不好,但你可以用awk做到这一点:
awk -F, '$1 $2 ~ /^[0-9]+$/ { print $1 $2 } input.txt
(请注意,在最后一个awk命令行中,除了print
之后的所有空格都可以删除而不影响功能。但是为了你未来的自我的理智,不要只压缩东西保存几个字节。没有性能差异,并且让事情变得不可读总是会延误你将来对破坏过程的修复。)
当然,您可以选择不使用awk。我们在这里所做的一切都可以单独用bash完成。
while IFS=, read x y; do [[ $x$y =~ ^[0-9]+$ ]] && echo "$x$y"; done < inp
答案 1 :(得分:1)
awk
救援:
#!/bin/awk
BEGIN {
FS=","
}
{
if( NR == 1 )
next
for( i = 1; i <= NF; i++ )
printf "%s", $i
print ""
}
# end-of-file #
一行:
$ awk -v FS="," '{ if(NR>1){ for(i=1;i<=NF;i++){ printf "%s", $i } print ""} }' input.txt
希望它有帮助!
答案 2 :(得分:0)
试试这个;
awk -F ',' '{if ($1 ~ /^[0-9]+$/ && $2 ~ /^[0-9]+$/ ) print $1$2}' yourCSV
实施例;
user@host:/tmp$ awk -F ',' '{if ($1 ~ /^[0-9]+$/ && $2 ~ /^[0-9]+$/ ) print $1$2}' input.csv
12345678
1112222
答案 3 :(得分:0)
awk -F, '{if($1 ~/^[0-9]+$/ && $2 ~/^[0-9]+$/) print $1 $2}' infile
12345678
1112222
答案 4 :(得分:0)
您的要求似乎很不清楚,但我猜是这样的。
awk -F, '/^[0-9]+,[0-9]+$/ { print $1 $2 }' file.csv
正则表达式检查该行是否包含两个整数,并且它们之间有逗号;如果是这样,我们将它们彼此相邻打印,没有任何字段分隔符。
答案 5 :(得分:0)
如果是这样,您可以测试两个字段是否都可以转换为数字和连续:
awk -F, '$1+0==$1 && $2+0==$2 {print $1 $2}' file
这支持浮动,否定等以及整数字段。
或者,只是检测一下你不想要的东西并跳过它们:
awk -F, '/[^0-9,]/{next} {print $1 $2}' file