解释

解释

我有一个包含以下内容的文件:

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 -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为计数器赋值 0
  • for (@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

相关内容