我有一个单列中有 X 行的文件,我想将每个偶数/奇数行打印到新列,这在 Linux 或vim
编辑器中可能吗?
例如:
输入文件:
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
输出文件,我需要:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
答案1
尝试下面。
$cat a.txt
RESOLUTION: 1.70
UNIT: MONOMERIC
RESOLUTION: 1.80
UNIT: DIMERIC
RESOLUTION: 2.50
UNIT: TRIMERIC
RESOLUTION: 2.20
UNIT: TETRAMERIC
$ cat a.txt | sed 'N;s/\n/ /g'
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
答案2
假设数据在文件 z1 上,那么
paste -sd "\t\n" z1
将产生:
RESOLUTION: 1.70 UNIT: MONOMERIC
RESOLUTION: 1.80 UNIT: DIMERIC
RESOLUTION: 2.50 UNIT: TRIMERIC
RESOLUTION: 2.20 UNIT: TETRAMERIC
在这样的系统上:
OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution : Debian 8.11 (jessie)
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23
最美好的祝愿...干杯,drl
答案3
您正在寻找正确的位置(awk 或 sed)。
sed
如果使用 gnu 就足够了sed
。
看https://www.gnu.org/software/sed/manual/sed.html#Numeric-Addresses
4.2 按数字选择行
……
first~step 此 GNU 扩展匹配从第一个行开始的每个步骤行。特别是,当存在非负 n 使得当前行号等于first + (n * step) 时,将选择行。因此,可以使用 1~2 选择奇数行,使用 0~2 选择偶数行;要从第二行开始每隔三行选取一次,将使用“2~3”;要从第十行开始每隔五行选取一次,请使用 '10~5';而“50~0”只是 50 的一种晦涩的说法。
以下命令演示了步骤地址的用法:
$ 序列 10 | sed -n '0~4p' 4 8
$ 序列 10 | sed -n '1~3p' 1 4 7 10
答案4
如果奇数行上有尾随空格,您可以编写一个ed
脚本:
{ for((line=1; line <= $(wc -l < input) / 2; line++)); do printf '%d,%dj\n' "$line" "$((line + 1))"; done; echo "wq"; } | ed -s input
重新格式化:
{ for((line=1; line <= $(wc -l < input) / 2; line++))
do
printf '%d,%dj\n' "$line" "$((line + 1))"
done
echo "wq"
} | ed -s input
总体思路是计算行数,将其除以二,打印ed
命令将连接奇数行和偶数行。对于八行示例文件,循环将生成以下ed
命令:
1,2j
2,3j
3,4j
4,5j
最后的echo
命令只是告诉ed
将文件写入磁盘并退出(退出)。
此方法不会在相邻行之间添加任何空格,因此如果您需要添加(比如说)一个选项卡,那么您需要通过在现有的之前添加此行来插入它printf
:
printf '%ds/$/ /\n' "$line"
您在替换文本中看到的空格是制表符(使用 , 输入Control-V)TAB。