-1

必要な次のシナリオがあります。

私は2つの非常に大きなファイルを持っています。各ファイルの行数は同じです。awk は、いくつかの条件を組み込んだ 2 つのファイルを結合できる便利なツールだと思います。提案してください。

File1
# header1, header2, header3, header4
1,2,3,4
11,12,13,14
21,22,23,24
31,32,33,34
41,42,43,44

File2
a   d  e  f
a   f  g  h
b   p  q
33  b  p  q
43  b  x  y

Final Output
1, 2, 3, 4, a, d, e, f
11, 12, 13, 14, a, f, g, h
21, 22, 23, 24, b, p, q
31, 32, 33, 34, b, p, q
41, 42, 43, 44, b, x, y

実際には file1 と file2 の間に接続があります。file1 の各行からいくつかのヘッダーが収集され、いくつかの小さなツールに基づいて file2 が生成されます。したがって、file1 の各行について、file2 の同じ行にいくつかの情報があります。そして、以下のロジックのように、これら 2 つのファイルを結合したいと考えました。

file2 の最初のエントリには「a」、「b」、またはこれに基づいて file1 のヘッダー 3 のいずれかが含まれます。「a」または「b」が含まれている場合は、「1、2、3、4、a、d」のように行を結合します。 、e、f"

file2 のエントリに file1 の header3 がある場合、「31、32、33、b、p、q」として結合します。

すべてのフィールドをコンマで区切る必要があります。そして、出力を他のファイルにダンプする必要があります。

私はPythonでも同じことを行うことができますが、ファイルが大きすぎるため、forループ処理に時間がかかりすぎて、多くのPython解釈時間が必要です..だから私はawkがそのようなタスクを行うためのより良いユーティリティだと思う.

提案してください。ありがとう。

4

2 に答える 2

1
paste -d, <(tail -n+2 File1) <(awk -vOFS=, '
{
    $1 = ($1 !~ /^(a|b)$/) ? "" : $1
}1' File2) | tr -s ,

1,2,3,4,a,d,e,f
11,12,13,14,a,f,g,h
21,22,23,24,b,p,q
31,32,33,34,b,p,q
41,42,43,44,b,x,y
  • paste <(commandA)<(commandB)は、2 つのプロセスの出力を結合します。
  • ;の代わりにコマンドで使用cond ? YES : NOします。awkif...else...
  • tr -sに変換,,され,ます。
于 2012-04-18T10:21:53.873 に答える
1

基本的な考え方は、行を で結合してからpaste、 を使用して重複したヘッダーを修正することawkです。

file2タブ区切りのフィールドがあると仮定しています。このパイプラインを試してください:

grep -v '^#' file1.csv \
| tr ',' '\t' \
| paste - file2.tsv \
| awk -v OFS="," '
    $3==$5 { print $1,$2,$3,$4,$6,$7,$8; next } 
    { $1=$1; print }'

提供されたサンプル データを使用すると、以下が生成されます。

1,2,3,4,a,d,e,f
11,12,13,14,a,f,g,h
21,22,23,24,b,p,q
31,32,33,34,b,p,q
41,42,43,44,b,x,y
于 2012-04-18T10:10:10.790 に答える