如何以特定模式合并 Unix (Sun Solaris) 中的行

如何以特定模式合并 Unix (Sun Solaris) 中的行

我有以下n平面文件中的行数:

uk,1234560000
uk,6789067000
uk,4567890000
.
.
.
n lines

现在我必须将其制作为以下格式:

uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000,......

我怎样才能进行这种转变?

答案1

有很多方法可以做到这一点。这是仅使用 shell 的一个(没有外部程序):

#!/bin/sh
IFS=, read -r f1 f2
printf "%s,%s-%s" "$f1" "$f2" "$f2"
while IFS=, read -r f1 f2
do
    printf ",%s-%s" "$f2" "$f2"
done
printf "\n"

将以上内容放入一个名为 、myscript.shdo的文件中chmod +x myscript.sh,然后运行./myscript.sh,输入和输出重定向到您想要的任何位置。

代码很简单

  • 读取两个字段,以 分隔,。写出field1 ,field2- field2,不是由换行符终止。
  • 虽然不在文件末尾,但读取两个字段,以,.将第二个写出两次,前面有 a ,,用 a 分隔-,并且不以换行符结尾。
  • 读取整个文件(到达文件末尾)后,写入换行符。

答案2

从这个文件开始:

$ cat file
uk,1234560000
uk,6789067000
uk,4567890000

如果问题中的格式正确,我相信这符合您的要求:

$ awk -F, '1==NR{printf "%s",$1} {printf ",%s-%s",$2,$2} END{print""}' file
uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000

怎么运行的

awk 一次会读入一条记录(行)。每行都分为多个字段。在此示例文件中,以逗号作为字段分隔符,第一个字段(称为$1)始终是数字uk,第二个字段(称为$2)是数字。

  • -F,

    这使得 awk 将逗号视为字段分隔符。

  • 1==NR{printf "%s",$1}

    NR是到目前为止读取的行数。当1 == NR,我们在第一线。当我们在第一行时,这告诉 awk 打印第一个字段uk

  • printf ",%s-%s",$2,$2

    对于所有行,这会告诉 awk 打印一个逗号,后跟第二个字段、破折号,然后再次打印第二个字段。

  • END{print""}

    当我们到达文件末尾时,这会告诉 awk 打印换行符。

相关内容