如何交错两个或多个文件的行?

如何交错两个或多个文件的行?

我试图将 2 个文件输出到一个文件中。我尝试过以下命令:

cat file1 file2

但这里file2数据附加到file1.

我需要的是第一行,file1然后是第一行,第二行,然后是第二行,等等。file2file1file2

谁能告诉我如何以简单的方式做到这一点?

答案1

有一个应用程序可以做到这一点!

$ cat file1
file1 line1
file1 line2

$ cat file2
file2 line1
file2 line2

现在,如果您将这些文件作为参数传递给paste

$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2

如果“file1 第一行后跟 file2 第一行,file1 第二行后跟 file2 第二行等”,您的意思是您希望在粘贴的每一行之间有一个新行,只需调整-d(分隔符) 选项即可。

$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2

答案2

POSIX awk;这适用于任意数量的文件,并且文件甚至不必具有相同数量的行。该脚本将继续运行,直到所有文件都超出行数:

BEGIN {
  do {
    br = ch = 0
    while (++ch < ARGC)
      if (getline < ARGV[ch]) {
        printf ch < ARGC - 1 ? $0 FS : $0 RS
        br = 1
      }
  } while (br)
}

答案3

快速解决方案

# Takes as many file arguments as needed
function InterleaveFiles {

    local counter=0
    local hasLine=true

    while [ $hasLine == true ]; do
            hasLine=false
            for i in "$@"; do
                    line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
                    if [ -n "$line" ]; then
                            echo "$line"
                    hasLine=true
                    fi
            done
            counter=$((counter+1))
    done
}

InterleaveFiles 文件 1 文件 2 文件 3 文件 4

答案4

paste -d '\n' file1 file2 > file3

其中file1file2是输入文件,file3将是创建的输出。

相关内容