文件有3列:
123711184642,3583090366663629,0036f920012437d4 123715942138,3538710295145500,0136f920afd6c643
我想删除第三列中的前两个字符: 123711184642,3583090366663629,36f920012437d4 123715942138,3538710295145500,36f920afd6c643
并交换第三列中前两个字符,以便最终结果为: 123711184642,3583090366663629,639f02012437d4 123715942138,3538710295145500,639f02afd6c643
任何帮助将不胜感激。 伯尼
答案 0 :(得分:1)
假设您的输入数据位于文件“foo”中,您可以执行以下操作:
cat foo | awk -F "," -f awkfile
awkfile包含:
{
v = ""
p = $3
printf ("%s,%s,", $1, $2)
for (i=3; i<9; i=i+2) {
printf ("%s%s", substr(p, i+1, 1), substr (p, i, 1))
}
printf ("%s\n", substr(p, 9))
}
答案 1 :(得分:1)
使用sed只是分组问题:
sed '
s/\(.*,\)../\1/;
s/,\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\([^,]*\)$/,\2\1\4\3\6\5\7/' file
答案 2 :(得分:1)
gawk:
gawk -F, '
BEGIN {OFS=FS}
{
$3 = gensub(/^..(.)(.)(.)(.)(.)(.)(.*)/, "\\2\\1\\4\\3\\6\\5\\7", 1, $3)
print
}
' in.txt
答案 3 :(得分:0)
sed
1班轮。只要你想改变最后一个字段,你就不在乎你有多少个字段。它也不关心最后一个字段有多少对,它们会相同地交换它们。
sed'h; s / ^。,.. //; s /(。)(。)/ \ 2 \ 1 / g; x; s /,[^,] $ /,/; G; s / \ n //'/ path / to / file
$ cat ./infile
123711184642,3583090366663629,0036f920012437d4
123715942138,3538710295145500,0136f920afd6c643
$ sed 'h;s/^.*,..//;s/\(.\)\(.\)/\2\1/g;x;s/,[^,]*$/,/;G;s/\n//' ./infile
123711184642,3583090366663629,639f021042734d
123715942138,3538710295145500,639f02fa6d6c34
h
- 制作整个s/^.*,..//
- 现在是模式空间
只保留最后一个字段
删除了两个前导号码s/\(.\)\(.\)/\2\1/g
- 这个数字
在模式空间中成对交换x
- 用hold保持交换模式空间
空间s/,[^,]*$/,/
- 删除整个
最后一个字段G
- 将保留空间附加到
模式空间之间有'\ n'
它们s/\n//
- 删除添加的'\ n'
G
答案 4 :(得分:0)
awk
1-liner只是为了它的乐趣。这并不关心第3个字段中有多少对数字,它将适用于所有数字。
awk -F,'{$ 3 = substr(gensub(/(.)(.)/,"/ 2 \ 1“,”g“,$ 3),3)} 1'OFS =,/路径/到/文件德尔>
$ cat ./infile
123711184642,3583090366663629,0036f920012437d4
123715942138,3538710295145500,0136f920afd6c643
$ awk -F, '{$3=substr(gensub(/(.)(.)/,"\\2\\1","g",$3),3)}1' OFS=, ./infile
123711184642,3583090366663629,639f021042734d
123715942138,3538710295145500,639f02fa6d6c34