awk:多行输出单个字符串,易于替换

发布于 2024-09-18 02:16:17 字数 218 浏览 3 评论 0原文

000 000 000 000 (4 个字段,每个字段由 3 个零组成,由空格分隔)

生成 4 个新行的过程

100 000 000 000

000 100 000 000 000

000 100 000

000 000 000 100

每行一组三个零被替换为 100

我该怎么做?

汤姆

000 000 000 000 (4 fields each of which is a group of 3 zeros separated by a space)

Process to generate 4 new lines

100 000 000 000

000 100 000 000

000 000 100 000

000 000 000 100

On ea line a group of three zeros is replaced by 100

How can I do this ?

tom

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少钕鈤記 2024-09-25 02:16:17
$ echo '000 000 000 000' | awk '{for (i=1;i<=NF;i++) {f=$i; $i="100"; print; $i=f}}'
100 000 000 000
000 100 000 000
000 000 100 000
000 000 000 100

编辑:

使用for循环对字段进行迭代。每个字段($i - 字段号 i)都保存到临时变量 f 中。然后该字段的内容被替换。打印记录 ($0)。使用临时值将该字段返回到其先前的值。

如果使用以下数据,可能会更容易理解:001 002 003 004。那么输出将如下所示:

100 002 003 004
001 100 003 004
001 002 100 004
001 002 003 100

Here's a shell script version using sed:

data='001 002 003 004'    # or 000 000 000 000
for i in {1..4}; do echo "$data" | sed "s/\<[0-9]\{3\}\>/100/$i"; done

or

count=$(echo "data" | $wc -w)
for ((i=1;i<=count;i++)); do echo "$data" | sed "s/\<[0-9]\{3\}\>/100/$i"; done

or Bash without any external utility:

data=(001 002 003 004)    # use an array
count=${#data[@]}
for ((i=0;i<count;i++)); do f=${data[i]}; data[i]=100; echo "${data[@]}"; data[i]=$f; done

或者许多其他可能性。

$ echo '000 000 000 000' | awk '{for (i=1;i<=NF;i++) {f=$i; $i="100"; print; $i=f}}'
100 000 000 000
000 100 000 000
000 000 100 000
000 000 000 100

Edit:

The fields are iterated over using the for loop. Each field ($i - for the field number i) is saved to a temporary variable f. Then the contents of the field are replaced. The record ($0) is printed. The field is returned to its previous value using the temporary value.

It might be easier to follow if this data was used: 001 002 003 004. Then the output would look like:

100 002 003 004
001 100 003 004
001 002 100 004
001 002 003 100

Here's a shell script version using sed:

data='001 002 003 004'    # or 000 000 000 000
for i in {1..4}; do echo "$data" | sed "s/\<[0-9]\{3\}\>/100/$i"; done

or

count=$(echo "data" | $wc -w)
for ((i=1;i<=count;i++)); do echo "$data" | sed "s/\<[0-9]\{3\}\>/100/$i"; done

or Bash without any external utilities:

data=(001 002 003 004)    # use an array
count=${#data[@]}
for ((i=0;i<count;i++)); do f=${data[i]}; data[i]=100; echo "${data[@]}"; data[i]=$f; done

Or many other possibilities.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文