一栏一分为二

一栏一分为二

我有一个一列的文件,我需要将其分成两列。我已经尝试过column命令,它似乎不起作用:

123-zyx
234-yxw
345-xwv
456-wvu
567-vut
678-uts

答案1

您可以简单地使用tr实用程序:

tr '-' $' ' < filename

输出:

123 zyx
234 yxw
345 xwv
456 wvu
567 vut
678 uts

你可以sed喜欢这样:

sed 's/-/ /g' < filename

输出:

123 zyx
234 yxw
345 xwv
456 wvu
567 vut
678 uts

答案2

您可以使用-s选项:

column -s- -t file

答案3

如果显示的示例输入数据位于名为./in然后...

<in >out tr -- - \\t

...会给你们两个<选项卡>名为的文件中的分隔列./out

不过,根据您的情况tr,您可能需要使用文字<选项卡>字符代替最后两个字符。事实上,您应该随意将最后两个分隔符替换为您可能想要的任何其他分隔符。

答案4

仅适用于 Bash:

# VERSION 1

while IFS=$'-' read -a line
do
    printf '%s %s\n' ${line[@]}
done < infile > outfile

或者 ...

# VERSION 2

main(){ 
  local IFS=$'-\n'
  local a=( $(<infile) )
  printf '%s %s\n' ${a[@]} > outfile
}

main

或者 ...

# VERSION 3

while IFS= read -r line
do
  printf '%s\n' "${line/-/ }"
done < infile > outfile

但要注意:参见这个帖子如果您正在考虑将其应用于大文件。


为了好玩,在中等大小的文件上进行一些基准测试。结果如下: “tr”显然是最佳选择,其次是 sed,然后是 awk。最好的 Bash 是版本 2(比 tr 慢 625 倍,内存使用量高 82 倍)。相比之下,sed 比 tr 慢 7.5 倍,awk 比 tr 慢 9 倍。

$ stat -c %s bigdata.txt && wc -l bigdata.txt
1439952
179994 bigdata.txt

# tr '-' $' ' < "$1" > tr.txt

CPU TIME AND RESOURCE USAGE OF './tr bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :    0.02
CPU, pct :   97.10
RAM, kb  : 1390.00

# sed 's/-/ /g' < "$1" > sed.txt

CPU TIME AND RESOURCE USAGE OF './sed bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :    0.15
CPU, pct :   98.90
RAM, kb  : 1386.80

# awk 'BEGIN{FS="-"} ; { print $1,$2 }' "$1" > awk.txt

CPU TIME AND RESOURCE USAGE OF './awk bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :    0.18
CPU, pct :   98.80
RAM, kb  : 1402.00

# BASH: VERSION 1

CPU TIME AND RESOURCE USAGE OF './bash_1 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :   16.35
CPU, pct :   99.00
RAM, kb  : 1486.40

# BASH: VERSION 2

CPU TIME AND RESOURCE USAGE OF './bash_2 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :   12.51
CPU, pct :   99.40
RAM, kb  : 114002.40

# BASH: VERSION 3

CPU TIME AND RESOURCE USAGE OF './bash_3 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :   15.45
CPU, pct :   99.00
RAM, kb  : 1484.00

相关内容