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
以及:
工作原理
这告诉awk将第一列写入print$1>“file1”
file1
这告诉awk将第二列写入打印$2>“文件2”
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