我的数据:
"1,2,3,4,5,64,3,9",,,,,1,aine
"2,3,4,5",,,,,3,bb
"3,4,5,6,6,2",,,,,2,ff
我必须在"…"内部转换值"像这样的分隔符:如何使用shell将值逐个转置?
并在一个新文件中输出结果(2列(,文件名=(最后1(列数字。我必须对输入文件的每一行进行转置。
我想要什么:
$ls
1 2 3 4 5 6 7 8
示例:cat 1
1 2
3 4
5 64
3 9
类别2:
3 4
5 6
6 2
类别3:
2 3
4 5
额外的好处:如果我能把最后一个单词(最后一列(作为新文件的标题,那就太完美了。
好的,花了一段时间,但我终于用下面的代码解决了你的问题:
#!/bin/bash
while read -r LINE; do
FILE_NAME=$(echo {$LINE##*,,,,,} | cut -d ',' -f 1 | tr -d """)
DATA=$(echo ${LINE%%,,,,,*} | tr -d """ | tr "," " ")
touch $FILE_NAME
i=1
for num in $DATA ;do
echo -n "$num"
if [[ $(($i%2)) == 0 ]]; then
echo ""
else
echo -n " "
fi
i=$((i+1))
done > $FILE_NAME
done < input.txt
在我的解决方案中,我假设您的输入应该放在文件input.txt
中,并且所有的输入行都有,,,,,
作为分隔符。使用您的示例输入就像一个魅力。
假设输入中没有冒号(如有必要,请选择不同的临时分隔符(,第一部分可以使用:
awk '{s = ""; n = split($2,k,","); for(i = 1; i <= n; i+=2 ) { s = sprintf( "%s%c%s:%s", s, s ? ":" : "", k[i+1], k[i])} $2 = s}1' FS=" OFS=" input | sort -t , -k6n | tr : ,
例如:
$ cat input
"1,2,3,4,5,64,3,9",,,,,1,aine
"2,3,4,5",,,,,3,bb
"3,4,5,6,6,2",,,,,2,ff
$ awk '{s = ""; n = split($2,k,","); for(i = 1; i <= n; i+=2 ) { s = sprintf( "%s%c%s:%s", s, s ? ":" : "", k[i+1], k[i])} $2 = s}1' FS=" OFS=" input | sort -t , -k6n | tr : ,
"2,1,4,3,64,5,9,3",,,,,1,aine
"4,3,6,5,2,6",,,,,2,ff
"3,2,5,4",,,,,3,bb
但现在还不清楚你为什么要做第一部分,因为你可以直接跳到第二部分:
awk '{n = split($2,k,","); m = split($3, j, ","); fname = j[6];
for( i = 1; i <= n; i+=2 ) printf("%d %dn", k[i+1], k[i]) > fname}' FS=" input
我的回答跟不上问题的变化!如果要将行输出到文件中,则无需对倒数第二列进行排序。如果您希望文件名是最后一列,那么不清楚为什么您提到使用倒数第二列。只需将上面的fname
更改为j[7]
即可获得最后一列。