【问题标题】:bash - print id number on multiple lines in new txt filebash - 在新的 txt 文件中的多行打印 id 号
【发布时间】:2018-03-26 23:58:37
【问题描述】:

我正在尝试将多个 .txt 文件连接成一个 .txt 文件。每个单独的文件有一列有 178 行,并与一个特定的人相关联。我希望连接的文件有三列:人的 ID #;人的会话#;取自单个 .txt 文件的值,例如:

  1. 所需的输出格式(减去项目符号):

     1 1 000
     1 1 001
     ....
     1 1 177
     1 2 000
     1 2 001
     ...
     1 2 177
    
  2. 我当前的脚本打印带有 ID # 和 session # 的输出仅打印在每个人的 178 行的第一行,其余 177 个值打印到 ID # 下面的第 1 列,例如:

     1 1 000
     001
     002
     ...
     177
     1 2 000
     001
     002
     ...
     177
     2 1 000
     001
     ...
    

我希望在从每个人的个人 .txt 文件中获取的 178 行中的每一行旁边获取 ID # 和 session #,而不仅仅是当前打印的第一行。

代码如下:

for subject in 170; do
    for session in 1 2; do

        cd ${datadir}
            ts_SalienceNetwork=$(cat sub${subject}.txt | awk '{print $1}')

            echo -e "${subject}\t${session}\t${ts_SalienceNetwork}" >> concat_data.txt

    done
done  

【问题讨论】:

  • subject in 170 如何在您的输出中打印为 1?
  • karakfa,为混乱道歉。它不打印“1”,而是为每个从(170 到 192)获取数据值的单个数据文件打印正确的主题#。

标签: bash awk printing echo cat


【解决方案1】:

$t_SalienceNetwork 包含整个文件,您只是将其他变量放在它之前,而不是每一行之前。

使用awk打印每一行的第一列,每行前面有变量,不需要变量。

cd "$datadir" # no need to do this each time through the loop
for subject in 170; do
    for session in 1 2; do
        awk -v subject="$subject" -v session="$session" '{printf("%s\t%s\t%s\n", subject, session, $1)}' "sub$subject.txt"
    done
done >> concat_data.txt

【讨论】:

  • 您也可以在 Awk 中编写会话循环。处理不同的主题会更复杂——这个循环可能最好留在 shell 中。
  • @Barmar 谢谢。我是新来的,感谢您的帮助。我将遍历多个目录,每个目录都有自己的文件,这就是为什么我在 for 循环中有 cd $datadir/$subject 的原因。 ts_SalienceNetwork 变量保存个人 sub${subject}.txt 中的数据,然后我打印到 concat_data.txt。在 concat_data.txt 文件中,我希望前两列指示每个数据点属于哪个参与者和会话,每个人和每个会话将有 178 行。您的建议仍然适用于此设置吗?谢谢!
猜你喜欢
  • 2022-01-19
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多