ファイル(.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
または)を理解するシェルが必要ですksh
。date
いくつかの説明が必要な場合があります。
プロセスの置き換え<( ... )
やや角かっこ内にコマンド出力を含む一時ファイルを生成します(実際には以下の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番目のレコード(つまり行))