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