![将 csv 文件的列替换为另一个文件中的列](https://linux22.com/image/37079/%E5%B0%86%20csv%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%97%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%88%97.png)
我有两个这样的示例文件:
$ 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/awk
或nawk
。
/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