193. 有效电话号码 Valid Phone Numbers
给定一个文本文件 file.txt
,请只打印这个文件中的第十行。
示例:
假设 file.txt
有如下内容:
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
你的脚本应当显示第十行:
Line 10
说明:
1. 如果文件少于十行,你应当输出什么?
2. 至少有三种不同的解法,请尝试尽可能多的方法来解题。
代码:
package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.Open("file.txt") if err != nil { fmt.Println(err) return } defer file.Close() scanner := bufio.NewScanner(file) lineNum := 0 for scanner.Scan() { lineNum++ if lineNum == 10 { fmt.Println(scanner.Text()) break } } if err := scanner.Err(); err != nil { fmt.Println(err) } }
调用系统命令:
awk 'NR==10{print}' file.txt
或: sed -n '10p' file.txt
调用代码:
package main import ( "fmt" "os/exec" ) func main() { cmd := exec.Command("awk", "NR==10{print}", "file.txt") //或 cmd := exec.Command("sed", "-n", "10p", "file.txt") output, err := cmd.Output() if err != nil { fmt.Println(err) } fmt.Print(string(output)) }
194. 转置文件 Transpose File
给定一个文件 file.txt
,转置它的内容。
你可以假设每行列数相同,并且每个字段由 ' '
分隔。
示例:
假设 file.txt
文件内容如下:
name age
alice 21
ryan 30
应当输出:
name alice ryan
age 21 30
代码:
package main import ( "bufio" "fmt" "os" "strings" ) func main() { // 打开文件 file, err := os.Open("file.txt") if err != nil { fmt.Println(err) return } defer file.Close() // 逐行处理文件,并将处理结果存入二维切片中 scanner := bufio.NewScanner(file) wordsSlice := make([][]string, 0) for scanner.Scan() { words := strings.Fields(scanner.Text()) wordsSlice = append(wordsSlice, words) } // 构建列向量切片并打印 for col := 0; col < len(wordsSlice[0]); col++ { colWords := make([]string, 0) for row := 0; row < len(wordsSlice); row++ { colWords = append(colWords, wordsSlice[row][col]) } fmt.Println(strings.Join(colWords, " ")) } }
调用系统命令:
awk 'BEGIN{FS="\t"}{for(i=1;i<=NF;i++){arr[i]=arr[i]" "$i}}END{for(i=1;i<=NF;i++){print substr(arr[i], 2)}}' file.txt
调用代码:
package main import ( "bufio" "fmt" "os/exec" "strings" ) func main() { cmd1 := exec.Command("awk", "BEGIN{FS=\"\\t\"}{for(i=1;i<=NF;i++){arr[i]=arr[i]\" \"$i}}END{for(i=1;i<=NF;i++){print substr(arr[i], 2)}}" , "file.txt") output, err := cmd1.Output() if err != nil { fmt.Println(err) return } scanner := bufio.NewScanner(strings.NewReader(string(output))) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println(err) } }