Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux将文件分为两列_Linux_Cut - Fatal编程技术网

Linux将文件分为两列

Linux将文件分为两列,linux,cut,Linux,Cut,我有一个包含两列的文件: A:B:IP:80 apples C:D:IP2:82 oranges E:F:IP3:84 grapes 如何将文件拆分为两个其他文件,每个列在一个文件中,如下所示: 文件1 文件2 Perl 1-liner使用(滥用)事实,即print转到STDOUT,即文件描述符1,而warn转到STDERR,即文件描述符2: # perl -n means lo

我有一个包含两列的文件:

A:B:IP:80                  apples    
C:D:IP2:82                 oranges    
E:F:IP3:84                 grapes
如何将文件拆分为两个其他文件,每个列在一个文件中,如下所示:

文件1

文件2

Perl 1-liner使用(滥用)事实,即
print
转到
STDOUT
,即文件描述符
1
,而
warn
转到
STDERR
,即文件描述符
2

 # perl -n means loop over the lines of input automatically
 # perl -e means execute the following code
 # chomp means remove the trailing newline from the expression

 perl -ne 'chomp(my @cols = split /\s+/); # Split each line on whitespace
           print $cols[0] . "\n";
           warn  $cols[1] . "\n"' <input 1>col1 2>col2
#perl-n表示自动循环输入行
#perl-e意味着执行以下代码
#chomp表示从表达式中删除尾随的换行符
perl-ne'chomp(my@cols=split/\s+/)#在空白处拆分每行
打印$cols[0]。“\n”;
警告$cols[1]。“\n”'col1 2>col2
当然,您可以在适当的列中使用
cut-b
,但是您需要读取文件两次。

尝试:

awk '{print $1>"file1"; print $2>"file2"}' file
运行该命令后,我们可以验证是否已创建所需的文件:

$ cat file1
A:B:IP:80
C:D:IP2:82
E:F:IP3:84
以及:

工作原理
  • print$1>“file1”

    这告诉awk将第一列写入
    file1

  • 打印$2>“文件2”

    这告诉awk将第二列写入
    file2


    • 这里有一个awk解决方案,它可以处理任意数量的列:

      awk '{for(n=1;n<=NF;n++)print $n>"File"n}' input.txt
      
      然后
      File2
      将包含:

      1
      3
      
      如果这是一个问题,请在更新您的问题时提及


      当然,您可以通过多种方式单独在bash中实现这一点。这里有一个:

      while read -r line; do
        a=($line)
        for m in "${!a[@]}"; do
          printf '%s\n' "${a[$m]}" >> File$((m+1))
        done
      done < input.txt
      
      读取-r行时
      ;做
      a=(美元行)
      对于“${!a[@]}”中的m;做
      printf'%s\n'${a[$m]}“>>文件$((m+1))
      完成
      完成

      这会将每行输入读入
      $line
      ,然后word将
      $line
      拆分为
      $a[]
      数组中的值。然后,它逐步遍历该数组,将每个项打印到相应的文件中,该文件以数组的索引命名(加上1,因为bash数组从零开始)。

      您自己尝试了什么?在这里发布之前?文件是空格分隔的还是制表符分隔的空格分隔的
      awk '{for(n=1;n<=NF;n++)print $n>"File"n}' input.txt
      
      A 1
      B
      C 3
      
      1
      3
      
      while read -r line; do
        a=($line)
        for m in "${!a[@]}"; do
          printf '%s\n' "${a[$m]}" >> File$((m+1))
        done
      done < input.txt