2つの大きなファイルからn番目の列を繰り返し読み込み、並べて切り取り、貼り付けて新しいn番目のファイルを作成します。

2つの大きなファイルからn番目の列を繰り返し読み込み、並べて切り取り、貼り付けて新しいn番目のファイルを作成します。

2つのファイルがあり、それぞれ約100,000のスペースで区切られた列があります。両方のファイルの各列を抽出し、別々のファイルに書き込み、コマンド2を実行したいと思います。

2つの列を持つファイルの例。

cat test1.txt
rr1 rr2
1 2
1 2
1 1
2 1

cat test2.txt
rr1 rr2
2 2
1 1
2 1
2 2

test1.txtの最初の列とtest2.txtの最初の列を取得し、これら2つの列が並んでいる新しいファイルという新しいファイルを作成したいと思います。これまで試したコードは次のとおりです。

awk -F' ' '{
  for(i=1; i<=NF; i++){ # iterate over each column
    paste -d' ' <(sed 1d test1.txt | awk -v var1="$i" '{print $var1}') <(sed 1d test2.txt | awk -v var2="$i" '{print $var2}' ) > out$i
    # write to file named with column name or i
    # do command2 for out$1
  } 
}'  

ただし、このコードはエラーを発生させます。

awk: cmd. line:3:     paste -d
awk: cmd. line:3:             ^ unexpected newline or end of string

期待される出力

cat out1
1 2
1 1
1 2
2 2

cat out2
2 2
2 1
1 1
1 2

私はこれに多くの時間を費やしましたが、この問題を解決する方法がわかりません。どんな助けでも大変感謝します。もっと良い方法がありますか?

ベストアンサー1

このようにしてくださいそしてツールボックスから列数と一般的なコマンドを取得します。

#!/bin/bash

for i in  $(seq 1 $(awk '{print NF;exit}' test1.txt)); do
    paste <(sed 1d test1.txt | cut -d ' ' -f"$i") \
          <(sed 1d test2.txt | cut -d ' ' -f"$i") > "out.$i"
done

または

#!/bin/bash

numcols=$(awk '{print NF;exit}' test1.txt)
for ((i=1; i<=numcols; i++)); do 
    paste <(sed 1d test1.txt | cut -d ' ' -f"$i") \
          <(sed 1d test2.txt | cut -d ' ' -f"$i") > "out.$i"
done

または使用:

#!/bin/ksh

numcols=$(awk '{print NF;exit}' test1.txt)
for i in  {1..$numcols}; do
    paste <(sed 1d test1.txt | cut -d ' ' -f"$i") \
          <(sed 1d test2.txt | cut -d ' ' -f"$i") > "out.$i"
done

それから:

cat out.1
cat out.2

コメントに記載されているように、あなたのようにawk混在させることはできませんshell

開発者でない場合は、ここで行ったように基本的なシェルコマンドを習得するのが最善です。

次の基本コマンドのドキュメントをお読みください。

  • tr
  • paste
  • sed
  • seq

それは基本的ではありません(ここでは簡単な方法で使用されます)。

  • awk

一時ファイル名で置換>(command ...)または置換を処理します。<(...)このファイルを書き込んだり読み込んだりすると、バイトは内部コマンドにパイプされます。通常はファイルリダイレクトと一緒に使用されますcmd1 2> >(cmd2)

望むより:
http://mywiki.wooledge.org/ProcessSubstitution
http://mywiki.wooledge.org/BashFAQ/024

おすすめ記事