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


10

我试图将2个文件输出到单个文件中。我试过下面的命令:

cat file1 file2

但是这里file2数据附加到file1

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

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

Answers:


17

有一个应用程序!

$ 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)
}

它有一个问题,如果输入包含'%'字符,它将尝试在printf中评估它们。我的更新是(我不确定这是否完全正确):printf "%s", ((ch < ARGC - 1) ? $0 FS : $0 RS)
Scala William

0

快速bash解决方案

# 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 file1 file2 file3 file4


-2
paste -d '\n' file1 file2 > file3

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


1
欢迎来到U&L Stack Exchange!这个答案几乎与terdon的答案相同。如果您认为自己可以改善答案,但又没有提供实质性的新信息,请考虑对现有答案进行修改。答案还会根据投票进行重新排序,因此每个答案应独立存在或参考其他答案。因此,shell oneliners应该附有说明,以解释其操作。
Thomas Nyman 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.