10,671列のファイルがあります。
すべての列が印刷されるまで、file_transpose01、file_transpose02、... file_transpose10という名前の1000個の列を持つ10個の小さなファイルに分割しようとします。ファイルの最初の列を各新しいサブファイルの最初の列として印刷しています。
私はそれが可能であることを知っています行番号としてawkを使用する。
NRの代わりにNFを使用して列に分割するようにこの方法を適用しようとしています。
awk 'BEGIN{$1;}NF%1000==2{x="masterfile_transposed"++i;a[i]=x;print f>x;}{print > x}' masterfile
しかし、エラーが発生します。
expression for `>' redirection has null string value. I am not sure what is wrong with my syntax. Is it possible to do this task using awk?
このアプローチをどのように機能させることができますか?それとも、より良いアプローチがありますか?
答え1
awk -v ncols=1000 '
{
f=1
file = "file_" f
for (i=1; i <= NF; i++) {
printf "%s%s", $i, OFS > file
if (i % ncols == 0) {
print "" > file
f++
file = "file_" f
}
}
print "" > file
}
' file
答え2
この列を何で区切るのかわかりませんが、次のようなファイルを作成しました。
i=0
until [ "$((i+=1))" -gt 100 ]
do seq -s ' ' 10671
done >/tmp/file
結果は100行と10671列で、それぞれは一連のスペースで区切られます。
次に私がしたことは:
sed 's/ */\n/1000;/\n/P;//D;G' </tmp/file | sed 's/.* //'
sed
データが分割される場所を明確に確認したいので、2番目のものを使用しています。単一行の何千もの列を理解するのは少し難しいかもしれません。だから最後の列まで各行を削除します。これを使用するたびに、s/.* //
行の最後の列だけを表示したいからです。たとえば、初めて実行すると印刷されます。
1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 10671
...100番。これは、各行が実際には次のように見えることを意味します。
1 2 3...1000
1001 1002 1003...2000
...など。sed
間違いなくデータを正しく分割しました...
だから私はそれを1行ずつ別々のファイルに分割するのはかなり簡単だと思いました。だから私の次のステップは次のとおりです。
sed 's/ */\n/1000;/\n/P;//D;G' </tmp/file |
sed -n "$(printf 'w /tmp/outfile.%d\nn\n' {1..11})"
/tmp
...すべての列が個別に分割された11個のファイルが作成されました。私はできます...
sed 's/.* //' /tmp/outfile.1
...印刷されます...
1000
1000
1000
1000
...25番。または...
sed 's/.* //' /tmp/outfile.11
...そして...
10671
10671
10671
10671
...25回もっと...