![如何以特定模式合并 Unix (Sun Solaris) 中的行](https://linux22.com/image/62996/%E5%A6%82%E4%BD%95%E4%BB%A5%E7%89%B9%E5%AE%9A%E6%A8%A1%E5%BC%8F%E5%90%88%E5%B9%B6%20Unix%20(Sun%20Solaris)%20%E4%B8%AD%E7%9A%84%E8%A1%8C.png)
我有以下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.sh
do的文件中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 打印换行符。