1

awkまたはを使用して確実に解決できるデータ操作の問題が少しありますbash

2 つの既存のデータ ファイルがあります。1つ目は、n個のブロックに配置されたタブ区切りのフィールドで構成されています。各ブロックは 1 行の空白行で区切られます。

1  3
2  4
3  5

4  6
5  7
6  8

2 番目のファイルには、最初のファイルのすべてのブロックと同じ長さの 1 列のデータしかありません。

a
b
c

私の問題は、出力が次のようになるように、ファイル 2 のデータ列をファイル 1 のすべてのブロックに追加する必要があることです。

1  3  a
2  4  b
3  5  c

4  6  a
5  7  b
6  8  c

何か考えはありますか?ファイルのデータを 2 回 (ブロック数) 新しいファイルに書き込み、これを追加しようとしましたが、これawkが正しく機能しませんでした。

4

3 に答える 3

2

この単純で動的な 1 つのライナーでうまくいきます。

awk 'NR==FNR{a[i++]=$0;next}{print (NF?$0 OFS a[j++%i]:$0)}' OFS='\t' file2 file1
1   3   a
2   4   b 
3   5   c

4   6   a
5   7   b
6   8   c
于 2013-09-28T22:18:12.663 に答える
1

2 番目のファイルの各行を配列に保存し、モジュール演算子 ( %) を使用して、データを含む最初のファイルの各行の内容を循環させます。

awk '
    BEGIN { FS = OFS = "\t" } 
    FNR == NR { data[ NR - 1 ] = $0; next } 
    ! $0 { print; next } 
    { ++i; print $0, data[ (i - 1) % 3 ] }
' file2 file1

次の結果が得られます。

1  3    a
2  4    b
3  5    c

4  6    a
5  7    b
6  8    c
于 2013-09-28T18:16:22.647 に答える
0

a.dat、 の2 つのファイルがあるとしますb.dat。これを行うことができます。

cat -n a.dat > aa.dat
cat -n b.dat > bb.dat
join aa.dat bb.dat | awk '{$1=""}1' > c.dat
rm aa.dat bb.dat

結果は に保存されc.datます。awk '{$1=""}1'行番号である最初の列を削除します。

于 2013-09-28T18:18:58.010 に答える