![](/img/trans.png)
[英]Efficiently transpose output from tab / new line delimited file in bash in dynamically changing file
[英]How to transpose values and output results in new file
我的數據:
"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 將值兩個兩個轉置?
和 Output 新文件中的結果(2列),文件名=(last-1)列數字。 我必須為輸入文件的每一行轉置。
我想要什么:
$ ls
1 2 3 4 5 6 7 8
示例:貓 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
但是,當您可以直接跳到第 2 部分時,不清楚為什么要執行第一部分:
awk '{n = split($2,k,","); m = split($3, j, ","); fname = j[6];
for( i = 1; i <= n; i+=2 ) printf("%d %d\n", k[i+1], k[i]) > fname}' FS=\" input
我的回答跟不上問題的變化,如果您將這些行輸出到文件中。 如果您希望文件名成為最后一列,則無需對倒數第二列進行排序。 不清楚你為什么提到使用倒數第二列。 只需將上面的fname
更改為j[7]
即可獲得最后一列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.