我有一个包含以下内容的文件:
1 2 3 4
1 3 5 4 8
3 2 1
每行的数字不同。像这样的数字还有 1000 多个。
我想要这样的输出:
1 2
2 3
3 4
4 0
1 3
3 5
5 4
4 8
8 0
3 2
2 1
1 0
对此帖子进行了编辑!
我的意思是,如果这是行中的最后一位数字,则将该数字放在旁边,然后在其旁边放置零。
例如,如果数字是该行中的最后一个数字,我们在输出新行中输入该数字和零
4 0 and others:see output sample tnx
在上面的例子中
我怎样才能做到这perl
awk
一点,bash
我用过这个但是不起作用:((
awk '{
for (i=1; i<NF; i++)
{
if ( $(i+1) == "")
print $i, "0"
else
print $i, $(i+1)
}
}' UniqASinline> inTestAst
Mr.glenn jackman 方式的输出文件:
对于这个输入:
3549
3549 10026
3549 10026 10010
3549 10026
awk '{for (i=1; i<=NF; i++) printf("%d %d\n", $i, $(i+1))}' filename
3549
3549 10026
10026
3549 10026
10026 10010
10010
3549 10026
10026
但我们期望:
3549 0
3549 10026
10026 0
3549 10026
10026 10010
10010 0
3549 10026
10026 0
谢谢
答案1
awk '{for (i=1; i<NF; i++) print $i, $(i+1)}' filename
编辑:以反映您的新要求
awk '{for (i=1; i<=NF; i++) printf("%d %d\n", $i, $(i+1))}' filename
# ----------------^
这利用了 awk 将未初始化的值(此处$(NF+1)
)视为空字符串(在字符串上下文中)或零(在数字上下文中)的事实。
答案2
尝试这样做perl
perl -lane '$c=0; for (@F){ print "$F[$c]\t$F[$c+=1]" if $F[$c+1]}' file.txt
或分解:
perl -lane '
$c=0;
for (@F) {
print "$F[$c]\t$F[$c+=1]"
if $F[$c+1];
}
' file.txt
解释
lane
开关表示:l=换行符;a=@F 数组中的自动分割;n=类似while (<>)
魔法钻石运算符;e=运行命令的基本开关$c=0
为计数器赋值 0for (@F) {
对于当前行的每个元素print "$F[$c]\t$F[$c+=1]"
:打印索引为 $c + tab + $c+1 的数组元素if $F[$c+1];
:仅当 $F[$c+1] 不为空时才应用最后一行
或者使用狂欢(相同算法),对于初学者来说可能更易于阅读:
while read a; do
arr=( $a )
for ((i=0; i< ${#arr[@]}; i++)); do
[[ ${arr[i+1]} ]] && echo "${arr[i]} ${arr[i+1]}"
done
done < file.txt
答案3
这是一个纯 bash 解决方案:
while read -a a; do
for ((i=0;i<${#a[@]}-1;++i)); do
echo "${a[@]:i:2}"
done
done < file.txt