0

それぞれ1000行のファイルが100個あります。

$ cat 1.txt
line1.1
line1.2
...
line1.1000

$ cat 2.txt
line2.1
line2.2
...
line2.1000

...

$ cat 100.txt
line100.1
line100.2
...
line100.1000

最初のファイルには 100 個のファイルの最初の行がすべて含まれ、2 番目のファイルには 100 個のファイルの 2 番目の行がすべて含まれるというように、それぞれが 100 行の 1000 個のファイルになるようにインターリーブする最も簡単な方法は何ですか? :

$ cat 1.txt
line1.1
line2.1
...
line100.1

$ cat 2.txt
line1.2
line2.2
...
line100.2

...

$ cat 1000.txt
line1.1000
line2.1000
...
line100.1000

Python スクリプトを作成することはできましたが、UNIX ツールを使用する賢い解決策があるかどうか疑問に思っていました。

4

6 に答える 6

1

pastesplitコンボが機能するはずです。

paste -d '\n' {1..100}.txt | split -l 100 -a 4 -d - out
于 2012-09-26T12:29:32.793 に答える
1
awk -F . '{print >> $2 ".new"}' {1..100}.txt
于 2012-09-26T13:40:32.217 に答える
0
awk '{if(count==1000){count=0;}count++;print >count".txt"}' *.txt

2行で正常にテストされました:

> cat 1.txte
1
2
> cat 2.txte
1
2
> awk '{if(count==2){count=0;}count++;print >count".txt"}' *.txte
> cat 1.txt
1
1
> cat 2.txt
2
2
> 

ファイルには1000行あるので、からcount==2に変更する必要があります。count==1000

于 2012-09-26T08:40:52.827 に答える
0

並べて使っpasteてみてはいかがでしょうか?

$ paste 1.txt 2.txt 3.txt 
line1.1 line2.1 line3.1
line1.2 line2.2 line3.2
line1.3 line2.3 line3.3
于 2012-09-26T08:09:41.533 に答える
0

出力ファイル名が入力ファイル名と衝突しないと仮定すると、次のようになります。名前が競合する場合は、出力ファイルを蓄積するための一時ディレクトリを使用するように次を変更します。

#!/bin/bash
for infilenum {1..100}
do
  outfilenum=1
  while read line
  do
    echo $line >> $outfilenum.out
    let outfilenum=outfilenum+1
  done < "$infilenum.txt"
done
于 2012-09-26T08:03:19.927 に答える
0
cat *.txt | awk '{x=NR%i?NR%i:i;print > x".txt"}' i=1000
于 2012-09-26T08:15:34.193 に答える