如何在新文件中转换值和输出结果



我的数据:

"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]即可获得最后一列。

相关内容

  • 没有找到相关文章

最新更新