聪明的bash解决方案重新排列文本文件中的行?

时间:2012-09-26 07:38:28

标签: bash unix text text-files

我有100个文件,每个文件有1000行:

$ 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

交错它们的最简单方法是什么,以便最终得到1000个文件,每个文件有100行,这样第一个文件包含100个文件中的所有第一行,第二个文件包含100个文件中的所有第二行,等等:

$ 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工具的聪明解决方案。

6 个答案:

答案 0 :(得分:1)

以下pastesplit组合应该有效:

paste -d '\n' {1..100}.txt | split -l 100 -a 4 -d - out

答案 1 :(得分:1)

awk -F . '{print >> $2 ".new"}' {1..100}.txt

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

cat *.txt | awk '{x=NR%i?NR%i:i;print > x".txt"}' i=1000

答案 5 :(得分:0)

awk '{if(count==1000){count=0;}count++;print >count".txt"}' *.txt

成功测试了两行:

> 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
> 

所以您必须从count==2更改为count==1000,因为您的文件有1000行。