unixを使用した列のコピーと置換[重複]

unixを使用した列のコピーと置換[重複]

ファイル(.txt)の最初の列をコピーし、Unixコードで区切られたテキストを使用して2番目のファイルの最初の列に置き換えたいと思います。

入力ファイル形式ファイル1

01/01/2007
02/01/2007
03/01/2007
04/01/2007

ファイル2

20070101 10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
20070102 10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
20070103 10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
20070104 10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

出力が必要

01/01/2007  10.2317   79.1638   6.0  26.7  20.9   0.8  14.0  98.6
02/01/2007  10.2317   79.1638   5.6  26.5  20.8   1.9  13.6  98.0
03/01/2007  10.2317   79.1638   7.5  27.7  20.8   0.1  15.8  96.4
04/01/2007  10.2317   79.1638   8.1  26.0  19.6   0.0  15.5  94.1

答え1

$ cut -d' ' -f 2- file2 | paste file1 -

cut最初の列が削除されますfile2-f 2-「出力フィールド(列)2以上のみ」を意味)。結果は最初の列にpaste内容を配置するために渡されます。file1コマンド-には、paste標準入力(この場合はパイプ)に渡されるコンテンツのプレースホルダがあります。cut

ステップバイステップ:

$ cut -d' ' -f 2- file2
10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

$ cut -d' ' -f 2- file2 | paste file1 -
01/01/2007      10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
02/01/2007      10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
03/01/2007      10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
04/01/2007      10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

このcutコマンドにはタブ区切りの入力が必要ですが、質問からコピーして貼り付けたため、スペースで区切られています。生データが実際にタブで区切られている場合は、コマンド-d' 'から削除してください。cut

デフォルトでは、このpasteコマンドは列1と2の間にタブを追加します。スペースが必要な場合はを使用してくださいpaste -d' ' file1 -

存在する別の問題file2、誰かがすでにここにある日付を使用して最初のファイルを完全に削除する方法を尋ねました。

私は最終的に得る

$ paste <( date -f <( cut -d ' ' -f 1 file2 ) +"%d/%m/%Y" ) \
        <( cut -d ' ' -f 2- file2 )
01/01/2007      10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6
02/01/2007      10.2317  79.1638   5.6  26.5  20.8   1.9  13.6  98.0
03/01/2007      10.2317  79.1638   7.5  27.7  20.8   0.1  15.8  96.4
04/01/2007      10.2317  79.1638   8.1  26.0  19.6   0.0  15.5  94.1

<( ... )これを行うには、プロセスの置き換え(例:bashまたは)を理解するシェルが必要ですkshdate

いくつかの説明が必要な場合があります。

プロセスの置き換え<( ... ) やや角かっこ内にコマンド出力を含む一時ファイルを生成します(実際には以下のFIFO /dev/fd)。したがって、コマンド全体は2つのステップに置き換えられます。

<(日付-f貼り付けカット出力1+"%d/%m/%Y")\
      cut2の出力

date -f filenameファイルの日付を読み取り、filename指定された書式文字列に従って各日付の書式を指定します。

それから:

生地出力日 cut2の出力

date最初の列の出力と2番目の列の出力とともに、列をcut別の列に貼り付けます。

答え2

awkバージョンによっては、次を使用して最初の列を変換できます。

awk '{$1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4); print $0}'  FILE2.csv

例:

echo "20070101 10.2317  79.1638   6.0  26.7  20.9   0.8  14.0  98.6"  | awk '{$1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4); print $0}'

返品:

 01/01/2007 10.2317 79.1638 6.0 26.7 20.9 0.8 14.0 98.6

メモ:

最初の部分は最初の列の値をオーバーライドします。

 $1=substr($0,7,2)"/"substr($0,5,2)"/"substr($0,1,4)

print $0行全体を印刷し、最初の列を再定義します。

答え3

これを達成するためにawkを使用することができます。

awk 'NR==FNR{a[++i]=$1;next}{$1=a[++k]; print}' file1 file2

NR==FNRパターンの意味は次のとおりです。{a[++i]=$1;next} file1の各レコード(つまり行)に対して実行します。

a[++i]=$1;next方法:レコードの最初のフィールド(つまり行)をレコード番号(つまりfile1の行番号)のインデックスとともに配列に保存し、次のレコードを読み込みます。

$1=a[++k]; print方法:インデックスkの配列の内容を現在のレコードの最初のフィールド(つまり行)にコピーします。(常にfile2のk番目のレコード(つまり行))

関連情報