csvファイルの列を別のファイルの列に置き換える

csvファイルの列を別のファイルの列に置き換える

次の2つのサンプルファイルがあります。

$ 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とを使うのはどうですかpaste?シェルがプロセス置換をサポートしている場合

$ 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

/usr/xpg4/bin/awk@devnullの答えまたはを試してください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

関連情報