将 csv 文件的列替换为另一个文件中的列

将 csv 文件的列替换为另一个文件中的列

我有两个这样的示例文件:

$ cat file1
abc,sachin
cat,kumar 

$ cat file2
xyz
pressure

$ cat file3 
xyz,sachin
pressure, kumar 

我希望将 的第一列file1替换为file2

我尝试做这样的事情:

$ awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' file1 file2

我正在使用 Solaris 10,但它似乎不支持此功能。还有其他建议吗?

答案1

cut使用and怎么样paste?如果您的 shell 支持进程替换,那么

$ paste -d, file2.txt <(cut -d, -f2 file1.txt)
xyz,sachin
pressure,kumar 

答案2

您需要指定输入字段分隔符。另外,我不知道你是如何选择领域的。在 awk 中,字段从 1 开始。两个输入文件中都没有 3 个字段。

以下内容应该适合您:

awk -F, 'FNR==NR{a[NR]=$1;next}{$1=a[FNR]}1' OFS=, file2.txt file1.txt

对于您的示例输入,它会生成:

xyz,sachin
pressure,kumar

答案3

您应该尝试使用 @devnull 的答案/usr/xpg4/bin/awknawk

/usr/bin下面和/bin上面的许多程序Solaris都不POSIX兼容。

或者您可以用于perl便携式:

$ perl -nle '                  
    unless (/,/) {                  
        push @a, $_;       
        next;
    }
    @l = split ",", $_;
    print "$a[$i++],$l[1]";
' file2.txt file1.txt
xyz,sachin
pressure,kumar

甚至更短:

$ perl -F',' -anle '
    if (@F == 1) {push @a,$_;next}    
    print "$a[$i++],$F[1]";
' file2.txt file1.txt

相关内容