如何连接CSV文件的两个字段并将结果打印到文件?

时间:2016-09-26 13:46:01

标签: bash csv awk

我有一个csv文件:

field1, field2
a,b
c,d
...

我想检查两个值是否都是正整数,如果是,则连接它们并写入输出文件。我有一段时间搞乱awk,但它根本不起作用并产生任何输出。

所以,如果输入是

1234,5678
123,asdf
123a,999
111,2222

预期输出为:

12345678
1112222

6 个答案:

答案 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